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

在R中如何生成新列存储值为99的对应列名

解决方案:为数据集添加缺失标记列

没问题!这需求在数据清洗里挺常见的,我给你两种实用的实现方式,适配不同的代码习惯:

方法1:用tidyverse工具链(推荐,代码更易读)

如果你平时习惯用dplyr和purrr这类包,这个方法会很顺手:

首先先定义原始数据集:

data <- data.frame(obs = c("a", "b", "c", "d"), 
                   test1 = c(5, 3, 2, 99), 
                   test2 = c(2, 3, 99, 2), 
                   test3 = c(4, 2, 5, 99))

然后执行以下代码生成目标列:

library(tidyverse)

data_result <- data %>%
  rowwise() %>%  # 开启逐行处理模式
  mutate(missing = {
    # 选中所有以test开头的列(也可以用具体列名向量,比如c("test1", "test2", "test3"))
    test_values <- c_across(starts_with("test"))
    # 筛选出值为99的列名,用逗号拼接
    missing_cols <- names(test_values)[test_values == 99] %>% paste(collapse = ",")
    # 如果没有符合条件的列,返回NA,否则返回拼接后的字符串
    ifelse(missing_cols == "", NA, missing_cols)
  }) %>%
  ungroup()  # 记得关闭逐行模式,避免后续操作变慢

方法2:基础R实现(无需额外安装包)

如果不想加载第三方包,用基础R的apply函数也能搞定:

# 先定位所有test开头的列的位置
test_col_indices <- grep("^test", names(data))

# 逐行遍历test列,生成missing列
data$missing <- apply(data[, test_col_indices], 1, function(row_values) {
  # 找出当前行中值为99的列名
  cols_with_99 <- names(row_values)[row_values == 99]
  # 空的话返回NA,否则拼接
  if (length(cols_with_99) == 0) NA else paste(cols_with_99, collapse = ",")
})

验证结果

两种方法最终生成的结果都和你期望的一致:

print(data)
#   obs test1 test2 test3    missing
# 1   a     5     2     4       <NA>
# 2   b     3     3     2       <NA>
# 3   c     2    99     5      test2
# 4   d    99     2    99 test1,test3

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 07:12:48