我有一个像这样的大数据框:
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循环,迭代遍历行,但这既不漂亮也不高效。我很确定有更好的方法来做到这一点。
我以为我可以:
slice <- df[, 2:ncols(df)]
dups <- df[duplicated(slice)]
uniq <- df[unique(slice)]
merge(uniq, dups, by... )
除非它不起作用,因为unique不会返回索引而是返回整个数据帧,这意味着我无法使用df
中的相应行索引slice
。
有什么建议吗?
编辑:我应该澄清A,B,C ......不是rownames,但实际上是数据框的一部分,以字符串/字符表示形式给出的条目
答案 0 :(得分:2)
有几个功能可以做到这一点。所有这些都是常见的聚合函数:aggregate
,tapply
,by
,...,当然还有流行的&#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 = ";")
,这样可以为最终输出提供更大的灵活性。