【问题标题】:R: Concatenate data frame column name with a numberR:用数字连接数据框列名
【发布时间】:2018-05-08 18:43:47
【问题描述】:

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

   mat=matrix(rnorm(40*5), ncol=5)
   df=as.data.frame(mat)
   df2 <- tidyr::gather(df, "x", "y", V1:V5)

这是mat创建的head(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 &lt;- tidyr::gather(df, "x", "y", V1:V5) 所以现在如果我得到一个有 40 列的新矩阵,我必须手动将其更改为 V20:@ 987654331@。

有没有办法像这样写:df2 &lt;- tidyr::gather(df, "x", "y", V1:V+ncol(mat)

【问题讨论】:

  • 您正在收集所有列,因此您可以将该参数留空...tidyr::gather(df, "x", "y") ?
  • 这似乎有效:df2 &lt;- tidyr::gather(df, "x", "y", "V1":"V5")。您可以将其扩展为简单地放入您想要作为字符的第一列,然后放入最后一列

标签: r dataframe tidyverse


【解决方案1】:

是的!您可以使用粘贴。

df2 <- tidyr::gather(df, "x" ,"y", V1:paste0("V", ncol(mat)))

当然,您使用的是所有列,因此您无需指定名称。但如果你真的想引用变量列名,我就是这样做的。

或者,如果您想使用以“V”开头的所有列,您可以这样做

df2 <- tidyr::gather(df, "x", "y", dplyr::starts_with("V"))

【讨论】:

    【解决方案2】:

    看起来你也可以简单地将列作为字符传递:

    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
    

    这可能很好,因为与排除任何列并自动收集所有列的选项相比,它提供了以编程方式选择所需列范围的灵活性。

    【讨论】:

      【解决方案3】:

      简单的列索引也适用于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
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2021-04-09
        • 2022-08-20
        • 1970-01-01
        • 1970-01-01
        • 2016-04-28
        • 1970-01-01
        • 1970-01-01
        • 2020-04-08
        相关资源
        最近更新 更多