簡體   English   中英

如何將數據框的行綁定到列表列表中的單獨元素中

[英]How to bind rows of dataframes in separate elements within a list of lists

假設我有一個列表列表,如下所示:

set.seed(111)
lst_1 = rep(list(list()), 3) 

lst_1[[1]] = list(data.frame(rnorm(5)), data.frame(rnorm(5)))
lst_1[[2]] = list(data.frame(rnorm(5)), data.frame(rnorm(5)))
lst_1[[3]] = list(data.frame(rnorm(5)), data.frame(rnorm(5)))

其中每個列表元素(1、2和3)是一個包含兩個data.frames的列表。

如何依次綁定每個(子)列表中第一個data.frame的行? lst_1[[1]][[1]] + lst_1[[2]][[1]] + lst_1[[3]][[1]] ,最后對第二個data.frame做同樣的data.frame

這是我想要的輸出,這是通過for循環手動實現的,但是我真正的列表列表要大得多:

lst_out = rep(list(list()), 2) 

for (i in 1:2) {
lst_out[[i]] = rbind(lst_1[[1]][[i]], lst_1[[2]][[i]], lst_1[[3]][[i]])
}

如果我的解釋正確,那么基本的R解決方案應該很簡單。 rbind函數Maplst_1 3個輸入的每個部分上:

do.call(Map, c(rbind, lst_1))

這是調用擴展的Map行的一種稍微模糊的方法:

Map(rbind, lst_1[[1]], lst_1[[2]], lst_1[[3]])

它開始看起來很像您的原始for循環,並提供與通過do.call進行操作相同的結果:

identical(
  do.call(Map, c(rbind, lst_1)),
  Map(rbind, lst_1[[1]], lst_1[[2]], lst_1[[3]])
)
#[1] TRUE

也檢查出預期的結果:

identical(lst_out, do.call(Map, c(rbind, lst_1)))
#[1] TRUE

我認為最簡單的方法是簡單地purrr::transpose列表,這樣就不用三個帶有兩個dataframe元素的子列表,而是兩個帶有三個dataframe元素的子列表。 這意味着要綁定的數據幀都在同一個子列表中,因此迭代要簡單得多,我們可以map到主列表上。 見下文,並指出,你可以加載purrr作為dplyr::bind_rows只是快一點和tibble::glimpse僅用於打印。

library(tidyverse)
set.seed(111)
lst_1 = rep(list(list()), 3) 

lst_1[[1]] = list(data.frame(rnorm(5)), data.frame(rnorm(5)))
lst_1[[2]] = list(data.frame(rnorm(5)), data.frame(rnorm(5)))
lst_1[[3]] = list(data.frame(rnorm(5)), data.frame(rnorm(5)))

lst_1 %>%
  transpose %>%
  map(bind_rows) %>%
  glimpse
#> List of 2
#>  $ :'data.frame':    15 obs. of  1 variable:
#>   ..$ rnorm.5.: num [1:15] 0.235 -0.331 -0.312 -2.302 -0.171 ...
#>  $ :'data.frame':    15 obs. of  1 variable:
#>   ..$ rnorm.5.: num [1:15] 0.14 -1.497 -1.01 -0.948 -0.494 ...

reprex軟件包 (v0.2.1)創建於2019-04-20

基礎R解決方案

set.seed(111)
lst_1 <- rep(list(list()), 3) 

lst_1[[1]] <- list(data.frame(rnorm(5)), data.frame(rnorm(5)))
lst_1[[2]] <- list(data.frame(rnorm(5)), data.frame(rnorm(5)))
lst_1[[3]] <- list(data.frame(rnorm(5)), data.frame(rnorm(5)))

lst_out_2 <- list()

for (i in 1:2) { 
  lst_out_2[[i]] <- do.call('rbind', sapply(lst_1, `[`, i))
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM