如何对列表中的奶牛距离数据框进行子集化与重组?
问题描述
我正在处理包含奶牛移动坐标信息的大型数据集,已将其拆分为列表中的多个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
相关产品推荐
相关产品推荐

