You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

基于后续3行温度变化创建heat_on列的R代码问题求助

问题分析与解决方案

代码错误原因

  1. 赋值方式错误:你用hh01$heat_on <- hh01 %>% mutate(...)试图把整个数据框赋值给单个列,这会导致类型不匹配,直接报错。正确做法是将mutate处理后的完整数据框重新赋值给hh01。
  2. 向量索引错误:temp_change_30是数据框的列(属于一维向量),不能用[-1, ]这种二维索引写法。而且手动截取向量(如temp_change_30[-1])会导致长度不匹配,触发循环补齐逻辑,完全打乱判断规则。
  3. 逻辑实现不当:判断后续行的值应该用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.24 23:33:22