[英]How to merge rows that have the same information in all columns except one?
我有一個看起來像這樣的大數據框:
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不會返回索引,而是返回整個數據幀,這意味着我無法使用slice
相應行對df
進行索引。
有什么建議么?
編輯:我應該澄清,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))
可以使用經典的paste(., collapse = ";")
方法代替toString
,它為最終輸出提供了更大的靈活性。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.