首页 > 解决方案 > 如何在 R 中将一列的元素与 group_by 相交

问题描述

让我们假设,我的数据就像

  group_id    col1
1        1     A,B
2        1     B,C
3        2     A,C
4        2     B,D
5        3     A,D
6        3 A,B,C,D

我想总结/变异 col1,其中它的元素在同一组中相交(通过 group_id)。我需要的输出就像(如果总结)

  group_id col1
1        1    B
2        2 <NA>
3        3  A,D

或像这样(如果变异)

  group_id col1
1        1    B
2        1    B
3        2 <NA>
4        2 <NA>
5        3  A,D
6        3  A,D

我可以通过使用函数轻松地创建一个联合,toString但我为如何在输出中包含公共元素而摸不着头脑。基本上intersect需要至少两个参数,因此在这里不起作用。

dput(df) 如下

df <-  structure(list(group_id = c(1L, 1L, 2L, 2L, 3L, 3L), col1 = c("A,B", 
"B,C", "A,C", "B,D", "A,D", "A,B,C,D")), class = "data.frame", row.names = c("1", 
"2", "3", "4", "5", "6"))

标签: rdplyrset-intersectionset-operations

解决方案


您可以使用逗号拆分col1并使用Reduce+intersect来获取每个group_id.

library(dplyr)
df %>%
  group_by(group_id) %>%
  summarise(col1 = toString(Reduce(intersect, strsplit(col1, ','))))

#  group_id col1  
#*    <int> <chr> 
#1        1 "B"   
#2        2 ""    
#3        3 "A, D"

推荐阅读