R中如何按条件计算列?现有代码未达预期(Pandas转R用户)
从Pandas转用R时的条件赋值问题分析
问题场景
尝试在R数据框s1中按条件计算change_max1列,编写的R代码未达预期,但功能类似的Pandas代码可正常运行:
问题R代码
s1$change_max1[s1['change_abs'] >0 ]= s1['high']-s1['close'] - s1['change_abs'] s1$change_max1[s1['change_abs']< 0 ]= s1['low'] -s1['close'] - s1['change_abs'] s1$change_max1[s1['change_abs']==0 ]= s1['change_abs']
正常运行的Pandas代码
s.loc[s1['change_abs']>0 ,'change_max']= s1['high']-(s1['close'] - s1['change_abs']) s.loc[s1['change_abs']<0 ,'change_max']= s1['low'] -(s1['close'] - s1['change_abs']) s.loc[s1['change_abs']==0,'change_max']= s1['change_abs']
问题根源
- 运算顺序错误:R代码的计算逻辑和Pandas不一致。Pandas中是
high - (close - change_abs),等价于high - close + change_abs;而R里写成了high - close - change_abs,数学结果完全不同。 - 未对应子集化右侧向量:R中左侧仅选取满足条件的行,但右侧使用了整个数据框的列向量。赋值时R会把右侧的完整向量循环补齐到左侧子集的长度,导致错误的值被写入目标行。
修正后的R代码
方式一:基础R(给右侧也做子集匹配)
# 先初始化列避免NA值问题 s1$change_max1 <- NA # 按条件选取对应行计算赋值 s1$change_max1[s1$change_abs > 0] <- s1$high[s1$change_abs > 0] - (s1$close[s1$change_abs > 0] - s1$change_abs[s1$change_abs > 0]) s1$change_max1[s1$change_abs < 0] <- s1$low[s1$change_abs < 0] - (s1$close[s1$change_abs < 0] - s1$change_abs[s1$change_abs < 0]) s1$change_max1[s1$change_abs == 0] <- s1$change_abs[s1$change_abs == 0]
方式二:用dplyr的case_when(更简洁易读)
library(dplyr) s1 <- s1 %>% mutate(change_max1 = case_when( change_abs > 0 ~ high - (close - change_abs), change_abs < 0 ~ low - (close - change_abs), TRUE ~ change_abs ))
内容的提问来源于stack exchange,提问作者ErwinRingley
相关产品推荐
相关产品推荐

