R语言如何提取数据框各列以dv开头的值合并为单独列
问题场景
现有如下结构的R数据框,所有以dv开头的目标值可能随机分布在任意列中,需要将这类值统一提取到新增的独立列中:
df <- data.frame( col1 = c(1,2,3), col2 = c(3,4,5), col3 = c("s1:i:2", "s1:i:3", "dv:i:2"), col4 = c("dv:i:4", "dv:i:4", "NA") ) df # col1 col2 col3 col4 # 1 1 3 s1:i:2 dv:i:4 # 2 2 4 s1:i:3 dv:i:4 # 3 3 5 dv:i:2 NA
实现方案
基础R实现(无需加载额外包)
用apply逐行遍历所有列,通过grep匹配开头为dv的元素,存入新列即可:
df$dv_col <- apply(df, 1, function(row) { matched <- grep("^dv", x = row, value = TRUE) if (length(matched) == 0) NA_character_ else matched[1] })
代码说明:正则
^dv表示匹配字符串开头为dv的内容,自动跳过数值列、字符串"NA"等不匹配项;如果单行列存在多个dv开头的值,上述代码默认取第一个匹配结果,需要保留全部结果时可以用paste(matched, collapse = ",")替换返回值即可。
Tidyverse实现
如果习惯用dplyr操作数据,可以用rowwise+c_across实现逐行匹配:
library(dplyr) df <- df %>% rowwise() %>% mutate( dv_col = { row_vals <- c_across(everything()) matched <- grep("^dv", row_vals, value = TRUE) ifelse(length(matched) == 0, NA_character_, matched[1]) } ) %>% ungroup()
运行结果
两种方法得到的输出一致,效果如下:
col1 col2 col3 col4 dv_col 1 1 3 s1:i:2 dv:i:4 dv:i:4 2 2 4 s1:i:3 dv:i:4 dv:i:4 3 3 5 dv:i:2 NA dv:i:2
内容的提问来源于stack exchange,提问作者Eric González
相关产品推荐
相关产品推荐

