如何让pmax/pmin不纳入带!xx!格式的非数值进行计算?
解决pmax/pmin排除!xx!格式值计算极值的问题
步骤1:清理数据,将无效值转换为NA并转数值型
原始数据中,Var1到Var5是字符型,包含数字字符串、"NA"字符串、!xx!格式的无效值三类内容。我们需要先把后两类内容转为真正的NA,再将列转为数值型,这样pmax/pmin才能正确识别并忽略无效值。
用base R实现:
# 提取所有以Var开头的列 var_cols <- grep("^Var", names(DF1), value = TRUE) # 批量处理列:替换无效值为NA,再转数值 DF1[var_cols] <- lapply(DF1[var_cols], function(col) { # 匹配!开头且!结尾的字符串,替换为NA col[grepl("^!.*!$", col)] <- NA # 匹配"NA"字符串,替换为NA col[col == "NA"] <- NA # 转换为数值型 as.numeric(col) })
步骤2:计算每行的最大/最小值
处理后的数据列已经是数值型,无效值都转为了NA,此时用do.call配合pmax/pmin即可计算每行极值:
# 计算每行最大值 DF1$max <- do.call(pmax, c(DF1[var_cols], na.rm = TRUE)) # 计算每行最小值 DF1$min <- do.call(pmin, c(DF1[var_cols], na.rm = TRUE))
最终结果
处理后的DF1如下:
> DF1 ID Var1 Var2 Var3 Var4 Var5 max min 1 A 1 NA NA 10 NA 10 1 2 B 20 NA NA NA NA 20 20 3 C NA 10 NA NA 20 20 10 4 D NA NA 30 NA NA 30 30 5 E NA NA NA NA NA NA NA
关键说明
- 原始代码错误的核心原因:
pmax对字符型数据会按字符串字典序比较,而非数值大小,且无法识别!xx!为无效值。 - 通过
grepl("^!.*!$", col)精准匹配!xx!格式的字符串,确保所有此类无效值都被转为NA。 do.call可以批量传入所有Var列,避免手动逐个列写在pmax参数里,更简洁高效。
内容的提问来源于stack exchange,提问作者user20330606
相关产品推荐
相关产品推荐

