从data.frames列表中选择具有最大尺寸的data.frame

问题描述 投票:0回答:1

我有一个 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())

r dataframe list tidyverse dimensions
1个回答
0
投票
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
© www.soinside.com 2019 - 2024. All rights reserved.