R:使用数字连接数据框列名

时间:2018-05-08 18:43:48

标签: r dataframe tidyverse

我有这个简单的代码,可以创建矩阵和数据框:

   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,我将值收集到两列xy

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)

3 个答案:

答案 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