首页 > 解决方案 > 聚合相同但针对单个列的行

问题描述

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

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))

编辑:为了解决可扩展性问题,我使用字符串向量输入调整了以下答案并在 dplyr 中按多列分组

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

cnames <- names(df)[-2]

然后使用group_by_at来自的函数dplyr

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

标签: r

解决方案


你可以尝试一个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))


推荐阅读