使用条件语句判断DataFrame列值并计算生成新列的问题咨询
问题核心原因
- 你使用的
&&运算符和普通if/else if结构不支持向量化运算
R中&&是标量短路运算符,仅会比较两个向量的第一个元素,返回单个布尔值;而普通if语句也仅能根据单个布尔值决定执行哪个分支,相当于你只用第一行数据的判断结果,给所有行应用了同一个计算逻辑,因此结果不符合预期。 - 代码未覆盖两列均为0的处理分支
需求中明确要求两列值都为0时新列也赋值为0,现有代码没有该逻辑,遇到对应数据会返回NA。
修复方案
基础R实现(无需额外包)
使用向量化的ifelse()函数,搭配逐元素比较的&运算符即可实现逐行判断:
# 示例数据 df <- data.frame(top = c(0, 2, 1, 4), bottom = c(1, 4, 0, 6)) # 计算新列 df$new <- ifelse(df$top == 0 & df$bottom == 0, 0, ifelse(df$top == 0, df$bottom, ifelse(df$bottom == 0, df$top, (df$top + df$bottom)/2)))
dplyr实现(逻辑更清晰)
如果可以使用第三方包,用case_when()写的逻辑可读性更强:
library(dplyr) df <- df %>% mutate(new = case_when( top == 0 & bottom == 0 ~ 0, top == 0 ~ bottom, bottom == 0 ~ top, .default = (top + bottom)/2 ))
运行上述代码后得到的结果完全匹配你的预期:
top bottom new 1 0 1 1 2 2 4 3 3 1 0 1 4 4 6 5
内容的提问来源于stack exchange,提问作者Michelle
相关产品推荐
相关产品推荐

