R语言基于条件计算生成新变量q的实现问题
正确解法与错误修正
用dplyr的case_when实现(推荐)
这是最清晰的写法,修正你之前case_when的语法错误即可:
library(dplyr) df <- data.frame (x = c(1, 5, 3, 6, 2, 4, 7), y = c(23, 34, 29, 26, 38, 54, 89), z = c(5, 45, 12, 56, 28, 67, 90)) df <- df %>% mutate( q = case_when( x >= 1 & x <= 3 ~ y - z, x >= 5 & x <= 7 ~ z - y, TRUE ~ NA_real_ # 用NA_real_保证数值类型,不要用字符串"NA" ) ) print(df)
运行后就能得到你想要的结果:
x y z q 1 1 23 5 18 2 5 34 45 11 3 3 29 12 17 4 6 26 56 30 5 2 38 28 10 6 4 54 67 NA 7 7 89 90 1
你之前的错误点:
- case_when的语法是
条件 ~ 结果,不是用逗号分隔,这是你报错的核心原因 - 不要用字符串
"NA",这会让q变成字符型,应该用NA_real_(数值型NA)或者直接NA(数值计算场景下R会自动识别为数值型) - 在dplyr管道里,直接用列名(比如x、y)即可,不需要加
df$前缀
用基础R的ifelse嵌套实现
如果你不想用dplyr,用基础R的向量化ifelse也能实现:
df$q <- ifelse(df$x >=1 & df$x <=3, df$y - df$z, ifelse(df$x >=5 & df$x <=7, df$z - df$y, NA)) print(df)
你之前if用法的错误:
- 基础R的
if是标量判断,只能处理长度为1的条件,而df$x是长度为7的向量,所以会报错"the condition has length > 1" - 必须用向量化的
ifelse才能处理向量条件,它会逐个元素判断并返回对应结果
你最初mutate尝试的错误修正
你第一次用mutate的写法完全错误,正确的mutate结合case_when就是上面第一种方法,不需要写q <- df(...)这种奇怪的语法,mutate的正确用法是直接在里面定义新列q = ...
内容的提问来源于stack exchange,提问作者Eli
相关产品推荐
相关产品推荐

