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

如何对列表中的奶牛距离数据框进行子集化与重组?

问题描述

我正在处理包含奶牛移动坐标信息的大型数据集,已将其拆分为列表中的多个data.frame,每个data.frame存储某15分钟时刻的奶牛间距离数据。现在需要对这些数据框进行拆分重组,得到以单头奶牛为单位、包含全时段距离数据的data.frame。

当前数据示例

# 构建原始Results列表
Results[["2023-08-15 00:01:00"]] <- data.frame(
 Cow1 = c(NA, 65, 2, 7),
 Cow2 = c(65, NA, 16, 84),
 Cow3 = c(2, 16, NA, 8),
 Cow4 = c(7, 84, 8, NA))

Results[["2023-08-15 00:16:00"]] <- data.frame(
 Cow1 = c(NA, 65, 2, 7),
 Cow2 = c(65, NA, 16, 84),
 Cow3 = c(2, 16, NA, 8),
 Cow4 = c(7, 84, 8, NA))

注:你补充的列表定义存在错误,正确的列表构建方式应为(需绑定数据框而非字符串):

time1 <- data.frame(
  Cow1 = c(NA, 65, 2, 7),
  Cow2 = c(65, NA, 16, 84),
  Cow3 = c(2, 16, NA, 8),
  Cow4 = c(7, 84, 8, NA))

time2 <- data.frame(
  Cow1 = c(NA, 65, 2, 7),
  Cow2 = c(65, NA, 16, 84),
  Cow3 = c(2, 16, NA, 8),
  Cow4 = c(7, 84, 8, NA))

Results <- list("2023-08-15 00:01:00" = time1, "2023-08-15 00:16:00" = time2)

期望输出格式

Results[["Cow1"]] <- data.frame(
 "2023-08-15 00:01:00" = c(NA, 65, 2, 7),
 "2023-08-15 00:16:00" = c(NA, 65, 2, 7)
)
# Cow2、Cow3、Cow4对应各自的全时段数据框

尝试过的失败代码

Results_Cows <- tapply(result, names(result), dplyr::bind_rows)

解决方案

方法1:基础R实现(无需额外包)

先提取奶牛名称,再循环提取每头奶牛在所有时间点的数据并组合:

# 获取所有奶牛名称(假设所有时间点的奶牛列表一致)
cow_names <- colnames(Results[[1]])

# 初始化结果列表
Results_Cows <- list()

# 循环处理每头奶牛
for(cow in cow_names) {
  # 提取该奶牛在各时间点的数据
  cow_data <- lapply(Results, function(df) df[[cow]])
  # 转为数据框并设置列名为时间点
  cow_data_df <- as.data.frame(do.call(cbind, cow_data))
  colnames(cow_data_df) <- names(Results)
  # 存入结果列表
  Results_Cows[[cow]] <- cow_data_df
}

方法2:tidyverse风格实现(需dplyr+purrr包)

如果你习惯使用tidyverse工具链,可使用以下代码:

library(dplyr)
library(purrr)

Results_Cows <- cow_names %>%
  set_names() %>%
  map(function(cow) {
    map_dfc(Results, ~.x[[cow]]) %>%
      set_names(names(Results))
  })

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.05 19:20:09