首页 > 解决方案 > 如何在R中组合具有特定名称的行

问题描述

我有一个数据框,其中包含来自循环的一些重复行:

                     v1     v2     v3    v4
  Number              1     2      3     5
  Index               0     0      0     0
  Number.1            1     2      3     5
  Index.1             0     0      0     0
  Number.2            1     2      3     5
  Index.2             0     0      0     0
  Number.3            1     2      3     5
  Index.3             0     0      0     0
  Number.4            1     2      3     5
  Index.4             0     0      0     0
  Number.5            1     2      3     5
  Index.5             0     0      0     0

我想将所有具有“数字”的行附加为一行值,每个值都在一个不同的列中

                      v1     v2     v3   v4    v5     v6     v7    v8
  Number              1     2      3     5      1     2      3     5   etc

我还没有找到任何简单的方法来做到这一点,虽然它看起来很容易。我尝试像这样使用 dplyr 没有成功:

  df[,rownames(df)%in%(grep("Number*", rownames(df))]

标签: rmergedplyr

解决方案


我们采用转置和连接 ( c) 得到一个vector

i1 <-  rownames(df)%in%(grep("Number(\\.\\d)*", rownames(df), value = TRUE))
v1 <- c(t(df[i1, ]))

注意:grep返回索引,因此无需%in%再次匹配行名

i2 <- grep("Number(\\.\\d)*", rownames(df))

子集就足够了

v2 <- c(t(df[i2, ]))

最好将其作为矢量而不是作为 data.frame。如果我们真的需要一个包含尽可能多列的单行 data.frame

as.data.frame.list(v1)

注意 2:稍微更改了模式以匹配.后面的数字(如果有)。在 OP 的代码中,它会检查Number*,即 0 或更多 'r'(尽管它在数据中有效)


推荐阅读