我有一个 data.frames 列表。列表中的每个 data.frame 都有不同的维度(不同的行数和列数)。我会列出从具有最多行和最多列(即总体最大尺寸)的列表中选择 data.frame。
我想要一个 tidyverse 解决方案,特别是尝试使用
purrr::keep()
- 但是我陷入困境,因为我无法弄清楚如何使与最大维度对应的索引成为逻辑条件。
我可以分两步完成,但似乎有点重复,想知道是否有任何方法可以在一行中完成此操作,所有这些都在
purrr::keep()
函数内。速度/效率也很重要,因为在我的真实数据中,将有近一百个不同的数据帧可供选择。
这是我尝试过的(两步版本):
# First get the size of the data.frame with the biggest dimensions in the list:
maxdim = 1:length(dflist) %>%
map_vec(~ reduce(dim(dflist[[.x]]), `*`)) %>%
max()
# Now select the data.frame from the list that matches maxdim:
dfinal = purrr::keep(dflist, ~ reduce(dim(.), `*`) == maxdim)[[1]]
注意我必须将
reduce()
与 dim()
一起使用,因为我找不到一个函数可以将 data.frame 的尺寸作为单个数字(即行数乘以列数)。它看起来相当快,但也想知道是否有专门的函数。我也尝试过length(unlist(df)
,但不知道是否更快。
这里是一些用于制作 data.frames 示例列表的代码:
# Create example data:
df <- data.frame(
id = c(1,2,3,4,5,6,7,8,9,10),
c1 = c("a", "a", "c", NA, "c", "d", "c", NA, "a", "b"),
c2 = c(25, NA, 17, 5, 50, 43, 21, 2, 1, NA),
c3 = c(NA, "s", "r", NA, "r", "i", NA, "r", NA, NA),
c4 = c(1.0, 5.3, 2.9, NA, 6.1, NA, 2.5, 4.3, 9.1, 2.4),
c5 = c(5, 6, NA, 3, 1, 6, 7, 8, 2, 1)
)
# Make a vector of columns to iteratively drop:
cols2drop <- c("c2", "c3", "c4", "c5")
# Create the list of data.frames (subsets of the original) of different sizes:
dflist = cols2drop %>%
map(~ df %>% select(1:.x) %>% drop_na())
dflist[[which.max(map_dbl(dflist, ~prod(dim(.x))))]]
id c1 c2
1 1 a 25
2 3 c 17
3 5 c 50
4 6 d 43
5 7 c 21
6 9 a 1