我正在使用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")
这并不是没有得到我想要的产品,而是对于更大的数据集来说是乏味的。我这样做的方式是运行names(df)并仅通过查看即可手动获取每个变量的位置。问题是我希望能够在具有相同变量的另一个数据集上以不同的顺序使用它,或者可能在具有不同顺序的其他dame数据集版本上使用它。我不想每次都手动搜索变量。
它们并不彼此相邻,所以我无法做到1:4、5:8等。它们在数据集中的位置也没有任何模式,因此我不能用它来轻松猜测它们的位置。 / p>
有没有一种方法可以使自动填充“可变”参数变得容易/自动化?
答案 0 :(得分:0)
您可以整体指定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")