聚集相同但行为一列的行

时间:2018-11-13 13:26:00

标签: r

我有一个看起来像这样的数据框:

entry color value1 value2
A     blue  1      0
A     green 1      0
B     green 1      0
C     red   0      1

我要合并所有列(输出颜色除外)具有相同值的行:

entry color        value1 value2
A     blue, green  1      0
B     green        1      0
C     red          0      1

我已尝试使用plyrddply来回答问题https://www.biostars.org/p/167028/。这段代码为这个最小的示例提供了正确的输出。但是,我的实际数据集有600列,因此这不是可行的解决方案。有人对大型数据集有什么建议吗?

df2 <-ddply(df, .(entry), summarize,
         color=paste(unique(color),collapse=","), 
         value1=paste(unique(value1),collapse=",") ,
         value2= paste(unique(value2),collapse=","))

示例数据框为:

df <- data.frame("entry" = c("A", "A", "B", "C"),"color" = c("blue", "green", "green", "red"), "value1" = c(1,1,1,0), "value2" = c(0,0,0,1))

编辑:为解决可伸缩性问题,我改编了以下答案和Group by multiple columns in dplyr, using string vector input

首先使用其索引创建一个由列名组成的向量,减去感兴趣的列:

cnames <- names(df)[-2]

然后使用group_by_at中的dplyr函数:

df %>%
 group_by_at(vars(one_of(cnames))) %>%
 summarise(color=paste(unique(color), collapse=",")) %>% 
 ungroup()

1 个答案:

答案 0 :(得分:2)

您可以尝试tidyverse

library(tidyverse)
df %>% 
  group_by(entry, value1, value2) %>% 
  summarise(color=paste(unique(color), collapse=",")) %>% 
  ungroup()
# A tibble: 3 x 4
  entry value1 value2 color     
  <fct>  <dbl>  <dbl> <chr>     
1 A          1      0 blue,green
2 B          1      0 green     
3 C          0      1 red 

如果要像这样列出重复项,请删除unique summarise(color=toString(color))