在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
相关产品推荐
相关产品推荐

