簡體   English   中英

如何合並除一個列外所有列中具有相同信息的行?

[英]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循環,該循環遍歷所有行,但這既不美觀也不有效。 我敢肯定,有更好的方法可以做到這一點。

我以為可以:

  1. 對df進行切片,因此我擁有除第一個slice <- df[, 2:ncols(df)]以外的所有列
  2. 通過dups <- df[duplicated(slice)]獲取具有所有“重復”行的數據幀
  3. 通過uniq <- df[unique(slice)]獲得帶有“唯一”行的另一個數據框
  4. 使用除第一列以外的所有內容合並它們merge(uniq, dups, by... )

除此之外這是行不通的,因為unique不會返回索引,而是返回整個數據幀,這意味着我無法使用slice相應行對df進行索引。

有什么建議么?

編輯:我應該澄清,A,B,C ...不是行名,而是實際上是數據框的一部分,以字符串/字符表示形式給出的條目

有幾個功能可以做到這一點。 它們都是通用的聚合函數: aggregatetapplyby ,...,當然還有流行的“ 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM