基于后续3行温度变化创建heat_on列的R代码问题求助
问题分析与解决方案
代码错误原因
- 赋值方式错误:你用
hh01$heat_on <- hh01 %>% mutate(...)试图把整个数据框赋值给单个列,这会导致类型不匹配,直接报错。正确做法是将mutate处理后的完整数据框重新赋值给hh01。 - 向量索引错误:
temp_change_30是数据框的列(属于一维向量),不能用[-1, ]这种二维索引写法。而且手动截取向量(如temp_change_30[-1])会导致长度不匹配,触发循环补齐逻辑,完全打乱判断规则。 - 逻辑实现不当:判断后续行的值应该用
dplyr的lead()函数,它能安全获取指定行数的后续值,且自动在无后续行的位置填充NA,保持向量长度与原数据框一致。
修正后的代码
假设你需要判断当前时段+下1个时段+下2个时段这三个时段的温度变化:
library(dplyr) hh01 <- hh01 %>% mutate( # 获取下1行的温度变化值 change_next1 = lead(temp_change_30, 1), # 获取下2行的温度变化值 change_next2 = lead(temp_change_30, 2), # 按规则生成heat_on列 heat_on = case_when( # 三个时段均降低(排除NA干扰) temp_change_30 < 0 & change_next1 < 0 & change_next2 < 0 ~ 0, # 三个时段均升高 temp_change_30 > 0 & change_next1 > 0 & change_next2 > 0 ~ 1, # 其他情况(含无后续行的末尾行) TRUE ~ 2 ) )
如果你的需求是判断当前之后的三个时段(下1+下2+下3),只需调整代码:
hh01 <- hh01 %>% mutate( change_next1 = lead(temp_change_30, 1), change_next2 = lead(temp_change_30, 2), change_next3 = lead(temp_change_30, 3), heat_on = case_when( change_next1 < 0 & change_next2 < 0 & change_next3 < 0 ~ 0, change_next1 > 0 & change_next2 > 0 & change_next3 > 0 ~ 1, TRUE ~ 2 ) )
补充说明
- 末尾行因没有足够的后续行,
lead()会返回NA,这类情况会被归类到heat_on=2,符合你的需求。 - 若需要严格排除
NA的影响,可以在条件中加入!is.na()判断,比如temp_change_30 < 0 & !is.na(change_next1) & change_next1 < 0 & !is.na(change_next2) & change_next2 < 0。
内容的提问来源于stack exchange,提问作者htee
相关产品推荐
相关产品推荐

