R tidyverse 如何获取tibble多字符列的共同元素并追加为新行
R 多列按行求交集实现方案
以下是可直接运行的完整代码,兼容任意数量目标列的求交需求:
library(tidyverse) # 示例数据 df <- tibble(food = c("pizza, bread, apple","joghurt, cereal, banana"), food2 = c("bread, sausage, strawberry", "joghurt, oat, bacon"), food3 = c("ice cream, bread, milkshake", "melon, cake, joghurt") ) # 核心逻辑:按行求所有列的共同元素 df_with_common <- df %>% # 按行处理数据 rowwise() %>% mutate( common = c_across(starts_with("food")) %>% # 拆分每个列的逗号分隔字符串为向量 str_split(", ") %>% # 对多个向量依次求交集,支持任意数量列 reduce(intersect) %>% # 转回逗号分隔的字符串格式 paste(collapse = ", ") ) %>% ungroup() # 追加共同元素汇总行到数据末尾 df_final <- df_with_common %>% add_row( # 可根据需求自定义新行各列的填充内容 food = "汇总行", food2 = "汇总行", food3 = "汇总行", # 此处示例为把所有行的共同元素拼接,可按需修改 common = paste(df_with_common$common, collapse = ", ") )
关键逻辑说明
c_across(starts_with("food"))会选中所有名称以food开头的列参与计算,避免其他无关列干扰,也可以替换为everything()使用所有列计算reduce(intersect)解决了map2仅支持两列操作的问题,会对传入的所有字符向量依次执行交集计算,列数多少都可以正常运行- 如果某一行没有跨列的共同元素,返回结果会是空字符串,可以加
ifelse(common == "", NA_character_, common)把空值替换为NA更规范 - 如果你更习惯不用
rowwise的写法,也可以用pmap实现相同效果:
df_with_common <- df %>% mutate( common = pmap( .l = across(starts_with("food"), ~str_split(.x, ", ")), .f = ~reduce(list(...), intersect) %>% paste(collapse = ", ") ) )
内容的提问来源于stack exchange,提问作者SysRIP
相关产品推荐
相关产品推荐

