如何折叠到数据框列表中具有最小int值的数据框

时间:2019-07-11 20:08:50

标签: r list dataframe

我想从数据帧列表中获取折叠的数据帧,并根据列表中可用数据帧中的同一单元格为每个单元格设置最小值。

下面给出的示例有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

2 个答案:

答案 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