gpt4 book ai didi

R:如何通过单列聚合数据帧列表,一次聚合所有列

转载 作者:行者123 更新时间:2023-12-04 12:14:16 24 4
gpt4 key购买 nike

给定一个数据框列表,像这样

[[1]]
ID X1 X2 X3 X4 X5
123 1 2 1 0 4
123 2 4 1 2 2
123 0 0 1 0 2
567 2 3 4 0 2
899 2 3 5 3 5

[[2]]
ID X1 X2 X3 X4
123 7 1 3 2
452 1 3 6 3
899 2 1 4 2

[[3]]
ID X1 X2 X3 X4 Y1
123 4 2 5 0 1
567 0 1 2 0 2
567 1 2 1 0 3
101 2 3 7 2 1

我想在所有其他列中按“ID”聚合所有数据帧,此图中的结果应该是这样的

new_df
ID X1 X2 X3 X4 X5 Y1
123 14 9 11 2 8 1
567 3 6 7 0 2 5
899 4 4 9 5 5 0
452 1 3 6 3 0 0
101 2 3 7 2 0 1

这只是一个示例,原始列表有 51 个 dfs,原始 dfs 有数百列,因此该函数无法指定聚合哪些列,而是应用于所有列

提前致谢

最佳答案

我们可以使用dplyr::summarize_all

# some sample data (different from yours, just to illustrate)
df_list = list(
data.frame(ID = c(123, 123, 234), x1 = c(1, 2, 3), x2 = 2:4),
data.frame(ID = c(123, 123, 234), x1 = c(1, 2, 3), x2 = 2:4, x3 = 4:6),
data.frame(ID = c(123, 123), x1 = c(1, 2), x3 = 2:3)
)

library(dplyr)
bind_rows(df_list) %>%
group_by(ID) %>%
summarize_all("sum", na.rm = TRUE)
# # A tibble: 2 x 4
# ID x1 x2 x3
# <dbl> <dbl> <int> <int>
# 1 123 9 10 14
# 2 234 6 8 6

编辑:由于您遇到了内存限制,您在 dplyr 中可以做的最好的事情是单独聚合每个数据帧,从而减少它的大小,然后再次组合和聚合。我建议使用一种简单的 for 循环方法来避免尝试一次复制所有数据:

for (i in seq_along(df_list)) {
df_list[[i]] = df_list[[i]] %>%
group_by(ID) %>%
summarize_all("sum", na.rm = TRUE)
}
# Then use the code from above
result = bind_rows(df_list) %>%
group_by(ID) %>%
summarize_all("sum", na.rm = TRUE)

这将在多大程度上帮助完全取决于每个数据帧中有多少 ID 重复。如果这仍然不起作用,那么接下来要尝试的是使用 data.table,它允许就地修改:

library(data.table)

for (i in seq_along(df_list)) {
setDT(df_list[[i]]) # convert data frames to data.tables
# pre-aggregate to reduce size
df_list[[i]] = df_list[[i]][ , lapply(.SD, sum, na.rm = TRUE), by = .(ID)]
}

# combine and aggregate
big_dt = rbindlist(df_list, fill = TRUE)
big_dt = big_dt[ , lapply(.SD, sum, na.rm = TRUE), by = .(ID)]

data.table 解决方案的内存效率应该很高。如果您仍然遇到内存问题,请确保您的工作区尽可能空,并且您也没有其他应用程序占用内存。如果这不起作用,请转到 R-FAQ Cannot allocate vector of size n获取更多提示(例如使用具有更多内存的计算机或使用允许内存不足计算的包)。

关于R:如何通过单列聚合数据帧列表,一次聚合所有列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52844297/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com