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

如何用R从DataFrame行中提取匹配指定列表的字符串至新列?

解决方案

Base R 实现

可以用apply()逐行处理数据,筛选出匹配目标列表的元素后,用逗号连接成字符串存入新列:

# 定义需要匹配的bug列表
bug <- c("bee", "wasp", "honeybee")

# 提取每行匹配项并生成新列
zoo$bug_extract <- apply(zoo[, c("A", "B", "C", "D", "E")], 1, function(row) {
  # 筛选出属于bug列表且非"0"的元素
  matches <- row[row %in% bug & row != "0"]
  # 用逗号连接匹配项,无匹配则返回空字符串
  paste(matches, collapse = ", ")
})

运行后得到的bug_extract列结果如下:

> zoo$bug_extract
[1] "bee, honeybee" "honeybee"      "bee, wasp"     "wasp, honeybee" ""

注:你提供的理想输出第一行存在笔误,原数据第一行的匹配项是bee和honeybee,上述代码返回的是符合数据逻辑的结果。

tidyverse 实现

如果习惯用tidyverse工具链,可结合dplyr和purrr实现:

library(dplyr)
library(purrr)

zoo <- zoo %>%
  rowwise() %>%
  mutate(bug_extract = {
    # 提取当前行A-E列的匹配项
    matches <- c_across(A:E)[c_across(A:E) %in% bug & c_across(A:E) != "0"]
    paste(matches, collapse = ", ")
  }) %>%
  ungroup()

代码说明

  • apply(..., 1, ...):指定对A-E列按行执行处理函数
  • row[row %in% bug & row != "0"]:过滤出属于目标列表且非空值(你的数据用"0"表示空)的元素
  • paste(..., collapse = ", "):将多个匹配项拼接成单个字符串,无匹配时自动返回空字符串
  • tidyverse版本中,rowwise()确保后续操作按行执行,c_across(A:E)提取当前行的指定列数据

内容的提问来源于stack exchange,提问作者ross

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.27 19:42:57