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

在R中统计满足温度阈值的最长连续天数(奶牛产奶数据集)

逐行统计连续超温最长天数的R实现

需求说明

给定包含每头牛5天温度数据的数据集,需计算每头牛这5天内温度超过30℃的最长连续天数,无超温则返回0。

玩具数据集

data <- data.frame(cow=1:5, milk=c(35,36,36,35,34), 
       day1ago=c(27,28,20,24,33), 
       day2ago=c(25,25,32,31,28),
       day3ago=c(22,31,25,31,29),
       day4ago=c(28,33,32,33,28),
       day5ago=c(29,28,33,34,31))

预期结果:

data$consecutive_days = c(0,2,2,4,1)

方法1:基础R实现(apply + rle)

利用rle()(游程编码)处理连续序列,结合apply()逐行计算:

# 定义单一行的处理函数
max_consecutive_hot <- function(temps, threshold = 30) {
  hot_days <- temps > threshold
  rle_result <- rle(hot_days)
  # 筛选连续超温的长度,取最大值(无则返回0)
  hot_lengths <- rle_result$lengths[rle_result$values == TRUE]
  if (length(hot_lengths) == 0) 0 else max(hot_lengths)
}

# 应用到所有行的温度列
data$consecutive_days <- apply(data[, paste0("day", 1:5, "ago")], 1, max_consecutive_hot)

方法2:tidyverse实现(dplyr)

适合熟悉tidyverse工作流的用户,用rowwise()逐行处理:

library(dplyr)

data <- data %>%
  rowwise() %>%
  mutate(
    consecutive_days = {
      # 提取当前行的所有温度列
      temps <- c_across(starts_with("day"))
      hot_days <- temps > 30
      rle_res <- rle(hot_days)
      hot_lengths <- rle_res$lengths[rle_res$values]
      if (length(hot_lengths) == 0) 0 else max(hot_lengths)
    }
  ) %>%
  ungroup()

结果验证

运行上述代码后查看data$consecutive_days,将得到与预期一致的[1] 0 2 2 4 1。

内容的提问来源于stack exchange,提问作者RoBeDo

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.28 08:10:21