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

使用R语言for循环计算列表中各ID的小时/日平均温度

问题描述

我有一个名为x的列表,其中每个元素对应一个ID的每10分钟温度数据,示例数据如下:

head(x)

$165.212

ID       Date     Time            DateTime       Temp
165.212 2023-07-18 10:31:00 2023-07-18 10:31:00 20.37
164.212 2023-07-18 10:41:00 2023-07-18 11:35:00 23.4
164.212 2023-07-18 10:51:00 2023-07-18 11:35:00 23.8
Lux      Fx Sex Sp   TimeOfDay                Hour
3060 164.212   M WT 10.58416667 2024-07-18 11:00:00
1287 164.212   M WT 10.75083333 2024-07-18 11:00:00
1128 164.212   M WT 10.91750000 2024-07-18 11:00:00

$164.314

ID       Date     Time            DateTime       Temp
164.314 2023-07-18 10:31:00 2023-07-18 11:35:00 32.5
164.314 2023-07-18 10:41:00 2023-07-18 11:35:00 33.2
164.314 2023-07-18 10:51:00 2023-07-18 11:35:00 22.8
Lux      Fx Sex Sp   TimeOfDay                Hour
3060 164.314   M WT 10.58416667 2024-07-18 11:00:00
1287 164.314   M WT 10.75083333 2024-07-18 11:00:00
2700 164.314   M WT 10.91750000 2024-07-18 11:00:00

我希望创建一个for循环,处理列表中的每个元素,计算对应ID的小时和日平均温度,最终生成包含ID、小时平均温度及日期/时间的新列表。我已创建了Hour列(将时间取整至最近小时),并希望基于该列分组聚合数据。

以下是我使用的代码,但无法正常运行,我知道需要指定要创建新列表:

for (each in x) {
  hour_t$ = x %>%
    group_by(Hour) %>%
    summarise(AvgTemperature = mean(Temp, na.rm = TRUE))
}

示例数据(结构化版本):

list(`165.212` = structure(list(ID = c("165.212", "164.212", 
"164.212"), Date = structure(c(19556, 19556, 19556), class = "Date"), 
    Time = c("10:31:00", "10:41:00", "10:51:00"), DateTime = structure(c(1689676260, 
    1689680100, 1689680100), class = c("POSIXct", "POSIXt"), tzone = "UTC"), 
    Temp = c(20.37, 23.4, 23.8), Lux = c(3060L, 1287L, 1128L), 
    Fx = c(164.212, 164.212, 164.212), Sex = c("M", "M", "M"), 
    Sp = c("WT", "WT", "WT"), TimeOfDay = c("10.58416667 2024-07-18", 
    "10.75083333 2024-07-18", "10.91750000 2024-07-18"), Hour = c("11:00:00", 
    "11:00:00", "11:00:00")), row.names = c(NA, -3L), class = "data.frame"), 
    `164.314` = structure(list(ID = c("164.314", "164.314", "164.314"
    ), Date = structure(c(19556, 19556, 19556), class = "Date"), 
        Time = c("10:31:00", "10:41:00", "10:51:00"), DateTime = structure(c(1689680100, 
        1689680100, 1689680100), class = c("POSIXct", "POSIXt"
        ), tzone = "UTC"), Temp = c(32.5, 33.2, 22.8), Lux = c(3060L, 
        1287L, 2700L), Fx = c(164.314, 164.314, 164.314), Sex = c("M", 
        "M", "M"), Sp = c("WT", "WT", "WT"), TimeOfDay = c("10.58416667 2024-07-18", 
        "10.75083333 2024-07-18", "10.91750000 2024-07-18"), 
        Hour = c("11:00:00", "11:00:00", "11:00:00")), row.names = c(NA, 
    -3L), class = "data.frame"))
解决方案

你的代码存在几个问题:

  • 循环中使用x而非当前迭代的each对象
  • 未初始化存储结果的列表,也未按索引/名称给结果赋值
  • hour_t$ = 属于语法错误,无法正确赋值

方法1:修正for循环实现

先初始化空列表存储结果,遍历列表时保留元素名称(即ID),处理后将结果存入列表:

# 初始化空列表
hour_avg_list <- list()

# 遍历列表,同时获取每个元素的ID名称
for (id_name in names(x)) {
  # 获取当前ID对应的数据集
  current_data <- x[[id_name]]
  
  # 按ID、日期、小时分组计算平均温度
  hour_avg <- current_data %>%
    group_by(ID, Date, Hour) %>%
    summarise(AvgTemperature = mean(Temp, na.rm = TRUE), .groups = "drop")
  
  # 将结果存入列表,用原ID作为名称
  hour_avg_list[[id_name]] <- hour_avg
}

# 查看结果
head(hour_avg_list)

方法2:更简洁的purrr包实现(推荐)

R中处理列表类数据时,purrr包的map函数比for循环更高效简洁:

library(purrr)
library(dplyr)

# 计算小时平均温度
hour_avg_list <- map(x, function(df) {
  df %>%
    group_by(ID, Date, Hour) %>%
    summarise(AvgTemperature = mean(Temp, na.rm = TRUE), .groups = "drop")
})

# 扩展计算日平均温度
daily_avg_list <- map(x, function(df) {
  df %>%
    group_by(ID, Date) %>%
    summarise(DailyAvgTemperature = mean(Temp, na.rm = TRUE), .groups = "drop")
})

说明

  • 分组时加入ID和Date,避免不同ID或日期的数据被错误合并
  • .groups = "drop" 用于取消分组状态,返回普通数据框
  • 两种方法最终都会生成一个列表,每个元素对应原ID的平均温度统计结果

内容的提问来源于stack exchange,提问作者Liz M.

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.21 15:32:32