我有这个简单的代码,可以创建矩阵和数据框:
mat=matrix(rnorm(40*5), ncol=5)
df=as.data.frame(mat)
df2 <- tidyr::gather(df, "x", "y", V1:V5)
这是由mat创建的头部(df):
V1 V2 V3 V4 V5
1 0.97111725 0.12937942 -0.89643594 -0.30144874 0.10405400
2 0.68372321 -0.08049954 -0.52891953 -0.56752185 -1.04425728
3 1.04553733 0.24499356 0.25919424 -1.51280159 0.70952009
4 0.16433896 -0.46727565 -0.22030923 1.18732203 0.17529333
5 -1.73732058 0.04977374 1.54042252 -1.27585563 -1.05846972
6 0.35953274 3.09224985 -1.24524965 -0.67492542 -0.68065365
然后我创建了另一个数据框df2
,我将值收集到两列x
和y
。
df2 <- tidyr::gather(df, "x", "y", V1:V5)
当我获得矩阵具有不同列数的新数据集时,我必须将df2
列的值更改为另一个数字。
示例:此处我使用V5
,因为我有5列:df2 <- tidyr::gather(df, "x", "y", V1:V5)
所以现在如果我得到一个包含40列的新矩阵,我必须手动将其更改为{ {1}}:V20
。
有没有办法写它:df2 <- tidyr::gather(df, "x", "y", V1:V20)
答案 0 :(得分:2)
是的!你可以使用粘贴。
df2 <- tidyr::gather(df, "x" ,"y", V1:paste0("V", ncol(mat)))
当然,您使用了所有列,因此您无需指定名称。但是在你真正想要引用变量列名的情况下,我就是这样做的。
或者,如果您想使用以&#34; V&#34;开头的所有列,您可以
df2 <- tidyr::gather(df, "x", "y", dplyr::starts_with("V"))
答案 1 :(得分:1)
看起来您也可以简单地将列作为字符传递:
df3 <- tidyr::gather(df, "x", "y", names(df)[1]:names(df)[5])
或者您在示例中明确指出要从V1:V+ncol(df)
开始:
df3 <- tidyr::gather(df, "x", "y", "V1":tail(names(df),1))
然后与您的结果进行比较:
identical(df2,df3)
#[1] TRUE
这可能很好,因为它提供了以编程方式选择所需列的任何范围的灵活性,与排除任何列的选项相比,它会自动收集所有列。
答案 2 :(得分:1)
简单列索引也适用于gather
。
gather
的文档读取...
个参数:精选列。如果为空,则选择所有变量。您可以 提供裸变量名,提供裸变量名, 使用x:z选择x和z之间的所有变量,使用-y排除y。对于 更多选项,请参阅dplyr :: select()文档。
mat=matrix(rnorm(40*5), ncol=5)
df=as.data.frame(mat)
df2 <- tidyr::gather(df, "x", "y", 1:5)
#OR
df2 <- tidyr::gather(df, "x", "y", V1:V5)
#OR
df2 <- tidyr::gather(df, "x", "y") #all columns
head(df2)
# x y
# 1 V1 -0.7403657
# 2 V1 -0.7501310
# 3 V1 2.0371748
# 4 V1 -1.2647994
# 5 V1 1.3464162
# 6 V1 -1.8981365
tail(df2)
# x y
# 195 V5 -2.2739219
# 196 V5 -0.8606414
# 197 V5 -0.8102747
# 198 V5 0.6362617
# 199 V5 0.9962820
# 200 V5 1.6503455