如何合并除一个列以外的所有列中具有相同信息的行?

时间:2015-03-03 10:54:25

标签: r merge dataframe

我有一个像这样的大数据框:

A  1  2  3  4  ...
B  1  2  3  4  ...
C  1  2  3  4  ...
D  5  2  1  4  ...
E  3  2  3  9  ...
F  0  0  2  2  ...
G  0  0  2  2  ...

如果您忽略第一列的第二列,您可以看到某些行是重复的条目。我想组合/合并这些行来生成这样的东西:

A;B;C  1  2  3  4  ...
D      5  2  1  4  ...
E      3  2  3  9  ...
F;G    0  0  2  2  ...

我可以编写一个for循环,迭代遍历行,但这既不漂亮也不高效。我很确定有更好的方法来做到这一点。

我以为我可以:

  1. 对df进行切片,因此除了第一个slice <- df[, 2:ncols(df)]
  2. 之外,我有所有列
  3. 通过dups <- df[duplicated(slice)]
  4. 获取包含所有“重复”行的数据框
  5. 通过uniq <- df[unique(slice)]
  6. 获取另一个包含“唯一”行的数据框
  7. 使用除第一列merge(uniq, dups, by... )
  8. 之外的所有列合并它们

    除非它不起作用,因为unique不会返回索引而是返回整个数据帧,这意味着我无法使用df中的相应行索引slice

    有什么建议吗?

    编辑:我应该澄清A,B,C ......不是rownames,但实际上是数据框的一部分,以字符串/字符表示形式给出的条目

1 个答案:

答案 0 :(得分:2)

有几个功能可以做到这一点。所有这些都是常见的聚合函数:aggregatetapplyby,...,当然还有流行的&#34;数据。表&#34;和&#34; dplyr&#34;功能集。

此处aggregate

aggregate(V1 ~ ., mydf, toString)
#   V2 V3 V4 V5  V6      V1
# 1  0  0  2  2 ...    F, G
# 2  5  2  1  4 ...       D
# 3  1  2  3  4 ... A, B, C
# 4  3  2  3  9 ...       E

其他选项(如开头段落所示):

library(data.table)
as.data.table(mydf)[, toString(V1), by = eval(setdiff(names(mydf), "V1"))]

library(dplyr)
mydf %>%
  group_by(V2, V3, V4, V5, V6) %>%
  summarise(V1 = toString(V1))

您可以使用经典的toString方法代替paste(., collapse = ";"),这样可以为最终输出提供更大的灵活性。