我有一个看起来像这样的大数据框:
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 ...不是行名,而是实际上是数据框的一部分,以字符串/字符表示形式给出的条目
有几个功能可以做到这一点。所有这些都是共同的聚集功能:aggregate
,tapply
,by
,...,当然,时下流行的“data.table”和“dplyr”的功能集。
这里是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 = ";")
方法,该方法为最终输出提供更大的灵活性。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句