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

拆分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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.09 16:07:37