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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.28 21:39:15