如何用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
相关产品推荐
相关产品推荐

