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

dplyr适配含NA场景:按指定列名提取值实现列值替换

问题描述

需要根据nameselect列的原始值,将该列(或生成新列)替换为对应姓名列(如name_01、name_02,实际数据包含更多此类列)的取值,要求无需逐一指定姓名列名,且支持nameselect列存在NA的场景。

示例数据:

nameselectname_01name_02
name_01AnnBernie
name_02BethClaire
NADaveElla

原使用dplyr的代码在nameselect含NA时失效:

df %>% 
  rowwise() %>% 
  mutate(result = get(nameselect)) %>% 
  ungroup()
解决方案

方案1:修复rowwise + get的方案

通过判断nameselect是否为NA,避免get()接收无效参数报错:

df %>% 
  rowwise() %>% 
  mutate(result = if_else(is.na(nameselect), NA_character_, get(nameselect))) %>% 
  ungroup()

如果需要直接替换原nameselect列,将代码中的result改为nameselect即可。

方案2:无rowwise的高效方案(推荐大数据量场景)

利用矩阵索引直接提取对应值,无需分组操作,NA会自动返回NA:

df$result <- df[cbind(seq(nrow(df)), match(df$nameselect, colnames(df)))]

原理:match(df$nameselect, colnames(df))获取每个nameselect值对应的列索引,结合行索引组成矩阵,直接从数据框中提取对应位置的内容,性能远优于rowwise分组方式。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.16 12:53:22