我想从数据帧列表中获取折叠的数据帧,并根据列表中可用数据帧中的同一单元格为每个单元格设置最小值。
下面给出的示例有5行2列。如果我在具有60,000行和15列的数据帧上运行下面显示的代码,这将非常慢。我想确定是否有解决此问题的更有效方法。
one_df <- data.frame(v1 = c(0,1,2,3,4), v2 = c(5,6,7,8,9))
two_df <- data.frame(v1 = c(1,2,2,3,4), v2 = c(5,6,7,7,8))
my_list <- list(one_df, two_df)
num_rows <- dim(one_df)[1]
num_cols <- dim(one_df)[2]
result_df <- one_df ## The collapsed data frame has the same dimensions as the input data frame
for (num_row in 1:num_rows){
for (num_col in 1:num_cols){
result_df[num_row, num_col] <- do.call("min", lapply(my_list, function(x) x[num_row, num_col]))
}
}
示例输入为:
> my_list
[[1]]
v1 v2
1 0 5
2 1 6
3 2 7
4 3 8
5 4 9
[[2]]
v1 v2
1 1 5
2 2 6
3 2 7
4 3 7
5 4 8
该示例的预期输出为:
> result_df
v1 v2
1 0 5
2 1 6
3 2 7
4 3 7
5 4 8
答案 0 :(得分:4)
尝试
do.call(pmin, my_list)
v1 v2
1 0 5
2 1 6
3 2 7
4 3 7
5 4 8
与通话相同
pmin(my_list[[1]], my_list[[2]], ..., my_list[[n]])
答案 1 :(得分:1)
带有reduce
library(purrr)
reduce(my_list, pmin)
另外,unlist
然后在其上执行min
可能更快
my_list1 <- my_list[rep(seq_along(my_list), each = 1e5)]
system.time(tapply(unlist(my_list1), rep(1:10, length(my_list1), FUN = min)))
# user system elapsed
# 0.334 0.013 0.348
system.time(reduce(my_list1, pmin))
# user system elapsed
# 29.665 0.141 29.729
system.time(do.call(pmin, my_list1))
# user system elapsed
# 25.371 0.109 25.450