R语言:如何从多列提取指定字符串生成新列?
解决方法
你的代码问题在于across()会返回包含多列的tibble,但你试图将其直接赋值给单个列component,导致结构不匹配。要实现目标,需将across提取的结果合并为单个列,取每行中第一个非NA的匹配值。
修正代码(简洁版)
library(dplyr) library(stringr) data <- tibble( component1 = c(NA, NA, "Word", NA, NA, "Word"), component2 = c(NA, "Word", "different_word", NA, NA, "not_this") ) # 生成目标结果 result <- data %>% mutate( component = coalesce( str_extract(component1, "Word"), str_extract(component2, "Word") ) ) # 验证与目标是否一致 all.equal(result, goal) # [1] TRUE
灵活版(适配多列场景)
如果目标列数量较多,可结合rowwise()和c_across()简化代码:
result <- data %>% rowwise() %>% mutate( component = coalesce(!!!str_extract(c_across(starts_with("component")), "Word")) ) %>% ungroup()
关键说明
str_extract():匹配到"Word"时返回该字符串,否则返回NAcoalesce():依次取每行的第一个非NA值,满足"任意列有'Word'则保留,无则返回NA"的需求- 灵活版通过
c_across()批量获取目标列值,!!!将提取结果展开为coalesce的参数,适合列名前缀统一的多列场景
内容的提问来源于stack exchange,提问作者Jan von Heynitz
相关产品推荐
相关产品推荐

