我在R中使用reshape()将我的数据集转换为宽数据集。事实是我在R中总共有大约70个变量,并且需要压缩十个变量的组(在宽数据集中随机分散)到一个变量。
例如:假设我在数据框中有以下变量:
ID V1 B1 N1 M1 V2 B2 M2 N2 B3 N3 V3 M3 ....需要获得V B N M组。
我的代码如下
reshape(df, idvar="id", varying = list(v=c(1,5,11), b=c(2,6,9), n=c(3,8,10), m=c(4,7,12)
v.names=c("v", "b", "n", "m"), direction="long")
这并不是说我没有得到我想要的产品,它对于更大的数据集来说是单调乏味的。我这样做,我运行名称(df)并通过查看手动获取每个变量的位置。问题是我希望能够以不同的顺序在具有相同变量的另一个数据集上使用它,或者可能在另一个版本的dame数据集上使用它,这可能使它们具有不同的顺序。我不想每次都手动搜索变量。
它们不是彼此相邻所以我不能做1:4,5:8等。它们在数据集中的位置也没有模式,所以我不能用它来轻松猜测它们的位置。
有没有办法让“变化”参数更容易填充/自动化?
您可以将varying=
变量指定为整个集合,然后使用sep=""
将具有相同前缀的所有变量分组,后跟一个数字。例如。:
dat <- data.frame(V1=1:3,S1=2:4,id=letters[1:3],S2=3:5,
var=10:12,V2=6:8, VERY=LETTERS[1:3],
TOWN1=0:2, TOWN2=1:3)
dat
# V1 S1 id S2 var V2 VERY TOWN1 TOWN2
#1 1 2 a 3 10 6 A 0 1
#2 2 3 b 4 11 7 B 1 2
#3 3 4 c 5 12 8 C 2 3
reshape(dat, idvar="id", varying=grepl("^(V|S|TOWN)\\d+$", names(dat)),
sep="", direction="long")
# id var VERY time V S TOWN
#a.1 a 10 A 1 1 2 0
#b.1 b 11 B 1 2 3 1
#c.1 c 12 C 1 3 4 2
#a.2 a 10 A 2 6 3 1
#b.2 b 11 B 2 7 4 2
#c.2 c 12 C 2 8 5 3
grepl()
部分基本上只生成一个TRUE / FALSE向量,用于标记要分组的变量,形式为V1,V2,Vn
/ S1,S2,Sn
或TOWN1,TOWN2,TOWNn
。你会注意到VERY
尽管以首都"V"
开始没有分组。
具体来说,"^(V|S|TOWN)\\d+$"
是在数据集的列名称中搜索的正则表达式:
^ start of the string
(V|S|TOWN) either V,S, or TOWN
\\d+ any number of repeats of a digit
$ end of the string
如果你没有潜在的冲突变量,你不想分组,你也可以使用varying=-n
排除"id"
变量位置并自动分组其他所有。例如。:
dat2 <- data.frame(id=letters[1:3], V1=1:3, S1=2:4, S2=3:5,
V2=6:8, TOWN1=0:2, TOWN2=1:3)
reshape(dat2, idvar="id", varying=-1, sep="", direction="long")