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

替换R语言中多条件行计数的嵌套循环,实现高效代码

替代嵌套循环:高效实现分组时间窗口统计与类别分配

问题背景

之前依赖嵌套循环处理以下逻辑:针对分组数据(如不同海狸),逐行完成三个操作:

  1. 统计同组内当前行时间前100秒内的测量行数
  2. 统计该时间窗口内温度高于37的行数
  3. 根据两者比例分配Low/Medium/High类别

嵌套循环在大数据集下效率低下,需改用dplyr或向量化方法优化,同时保证代码易读可分享。


优化方案1:dplyr + purrr 实现清晰的分组窗口统计

利用dplyr分组特性结合purrr的map函数,替代逐行循环,代码结构清晰,适合中等规模数据集:

library(dplyr)
library(purrr)

# 构建示例数据(与原代码一致)
beaver_data <- bind_rows( 
  beaver1 %>% mutate(beaver = "1"),
  beaver2 %>% mutate(beaver = "2")
) %>%
  filter(!(beaver == "1" & day == 347)) %>%
  filter(!(beaver == "2" & day == 308))

# 分组处理时间窗口统计与类别分配
beaver_data_opt <- beaver_data %>%
  group_by(beaver) %>%
  mutate(
    # 为每行生成对应时间窗口内的同组数据子集
    window_data = map(time, ~filter(cur_data(), between(time, .x - 100, .x))),
    # 统计窗口内总行数
    count_total = map_int(window_data, nrow),
    # 统计窗口内温度>37的行数
    count_high_temp = map_int(window_data, ~sum(.x$temp > 37)),
    # 计算比例并分配类别
    ratio = count_high_temp / count_total,
    class = case_when(
      ratio < 0.5 ~ "Low",
      ratio < 1 ~ "Medium",
      TRUE ~ "High"
    )
  ) %>%
  # 移除中间辅助列(可选,按需保留)
  select(-window_data) %>%
  ungroup()

优化方案2:slider包实现高效滚动窗口(适合大数据集)

如果数据集规模很大,推荐使用slider包的滚动窗口函数,它基于向量化实现,效率远高于逐行处理:

library(dplyr)
library(slider)

# 构建示例数据
beaver_data <- bind_rows( 
  beaver1 %>% mutate(beaver = "1"),
  beaver2 %>% mutate(beaver = "2")
) %>%
  filter(!(beaver == "1" & day == 347)) %>%
  filter(!(beaver == "2" & day == 308))

# 高效滚动窗口统计
beaver_data_opt_slider <- beaver_data %>%
  group_by(beaver) %>%
  arrange(time) %>% # 必须先按时间排序,保证滚动窗口逻辑正确
  mutate(
    # 统计当前时间前100秒内的总行数
    count_total = slide_index_dbl(time, time, ~nrow(.x), .before = 100),
    # 统计当前时间前100秒内温度>37的行数
    count_high_temp = slide_index_dbl(time, time, ~sum(.x$temp > 37), .before = 100),
    # 计算比例并分配类别
    ratio = count_high_temp / count_total,
    class = case_when(
      ratio < 0.5 ~ "Low",
      ratio < 1 ~ "Medium",
      TRUE ~ "High"
    )
  ) %>%
  ungroup()

方案优势

  • 完全替代嵌套循环,避免逐行迭代的性能损耗
  • 代码模块化,分组逻辑、窗口统计、类别分配分离,便于同事理解和维护
  • 两种方案适配不同数据规模:dplyr+purrr侧重可读性,slider侧重大数据集效率

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.03 01:32:20