You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.04 03:54:03