在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
相关产品推荐
相关产品推荐

