在R语言中基于分组列提取多列逗号分隔值的唯一值
按分组汇总多列中的唯一动物
原始数据集
group X Y Z A cat, dog dog, fox A fox, chicken dog, fox, chicken A B fox, dog B fox B bunny
需求
按group列分组,汇总X、Y、Z三列中的所有唯一动物,得到如下结果:
group animal A cat, dog, fox, chicken B bunny, dog, fox
动物顺序无关,只要是唯一值即可。
尝试过的错误方法
- 仅处理单列时产生大量NA:
df %>% group_by(group) %>% separate_rows("X", sep=",") %>% distinct %>% summarise(X = toString(X))
- 仅适用于数值变量,无法处理当前场景:
df %>% group_by(group) %>% summarise_at(vars("X","Y","Z"), sum)
正确实现方法
可以结合tidyr的pivot_longer将多列转为长格式,再统一处理逗号分隔值,最后去重汇总:
library(dplyr) library(tidyr) df %>% pivot_longer(cols = c(X, Y, Z), names_to = "col", values_to = "animal") %>% separate_rows(animal, sep = ",\\s*") %>% # 匹配逗号及后续空格,避免拆分出带空格的动物名 filter(!is.na(animal), animal != "") %>% # 过滤空值与NA group_by(group) %>% distinct(animal) %>% summarise(animal = toString(animal))
代码说明
pivot_longer:将X/Y/Z三列合并为单列,统一处理所有动物值separate_rows:把每个单元格内的逗号分隔值拆分为单独行filter:清除无效的空值和NA,避免干扰结果distinct(animal):在分组内保留唯一的动物条目summarise:将分组内的唯一动物用逗号连接为字符串
内容的提问来源于stack exchange,提问作者Gabriel G.
相关产品推荐
相关产品推荐

