拆分data.table列值并提取最小值,全为NA则保留NA
R语言data.table列转换:按规则处理逗号分隔字符串为数值型
首先是原始的data.table定义:
library(data.table) dt <- data.table(x = c(NA, NA, NA, NA, NA, NA, NA, "1,2", "NA,3", "NA,NA,NA", "NA,NA,NA,NA", "NA,NA", "NA,4,NA,1", "NA,NA,NA", "NA,NA"))
原始数据内容:
x 1: <NA> 2: <NA> 3: <NA> 4: <NA> 5: <NA> 6: <NA> 7: <NA> 8: 1,2 9: NA,3 10: NA,NA,NA 11: NA,NA,NA,NA 12: NA,NA 13: NA,4,NA,1 14: NA,NA,NA 15: NA,NA
处理规则
- 若条目本身已是NA,保留NA
- 若逗号分隔的所有子项都是"NA",则设为NA
- 若混合"NA"与数字,取其中最小的数字
- 若所有子项都是数字,取最小的数字
解决方案
提供两种实现方式,按需选择:
方式一:自定义函数处理(逻辑清晰)
# 定义处理单个字符串的函数 process_single <- function(s) { if (is.na(s)) return(NA_real_) # 拆分字符串为子项 sub_items <- strsplit(s, ",")[[1]] # 转换为数值,"NA"会自动转为NA num_vec <- as.numeric(sub_items) # 筛选出有效数字 valid_nums <- num_vec[!is.na(num_vec)] # 根据有效数字数量返回结果 if (length(valid_nums) == 0) NA_real_ else min(valid_nums) } # 应用到data.table的x列 dt[, x := sapply(x, process_single)]
方式二:向量化处理(效率更高,适合大数据集)
dt[, x := { # 拆分字符串为多列,并自动转换类型("NA"转为NA) split_cols <- tstrsplit(x, ",", type.convert = TRUE) # 对每行计算最小值,全NA则返回NA apply(split_cols, 1, function(row) { if (all(is.na(row))) NA else min(row, na.rm = TRUE) }) }]
处理后结果
x 1: NA 2: NA 3: NA 4: NA 5: NA 6: NA 7: NA 8: 1 9: 3 10: NA 11: NA 12: NA 13: 1 14: NA 15: NA
内容的提问来源于stack exchange,提问作者98198128
相关产品推荐
相关产品推荐

