簡體   English   中英

從 data.frames 列表中創建具有特定行的 data.frames 列表

[英]Create list of data.frames with specific rows from list of data.frames

我有許多 data.frames 存儲在列表 (list1) 中,並想用 data.frames 創建一個新列表 (list2),其中第一個包含 list1 中 data.frames 的所有第一行,第二個包含所有第二行等。這是一個例子:

set.seed(42)
df1 <- data.frame(a=sample.int(100,3),b=sample.int(100,3))
df2 <- data.frame(a=sample.int(100,3),b=sample.int(100,3))

list1 <- list(df1,df2)
list1

[[1]]
  a  b
1 92 84
2 93 64
3 29 51

[[2]]
  a   b
1 74  71
2 14  46
3 65 100

由此我想創建列表 2,如下所示:

[[1]]
  a  b
1 92 84
2 74  71

[[2]]
  a   b
1 93 64
2 14  46

[[3]]
  a   b
1 29 51
2 65 100

R執行此操作的有效方法是什么?

如果所有的行數都相同

nr <- nrow(list1[[1]])
lapply(seq_len(nr), function(i) do.call(rbind, lapply(list1, function(x) x[i,])))

另一種選擇是將其綁定到單個 data.frame,按組創建一個序列並split ,這將處理行數不等的lists

library(dplyr)
library(data.table)
bind_rows(list1, .id = 'grp') %>%
    mutate(rn = rowid(grp)) %>%
   {split(.[c('a', 'b')], .$rn)}

假設所有數據幀具有相同的行數和列數,以下工作:

split(do.call(rbind, lapply(list1, function(x) x)), 
      rep(1:nrow(list1[[1]]), length(list1)))

# $`1`
# a  b
# 1 92 84
# 2 74  71
# 
# $`2`
# a   b
# 1 93 64
# 2 14  46
# 
# $`3`
# a   b
# 1 29 51
# 2 65 100
d = lapply(list1, asplit, 1)
Map(rbind, d[[1]], d[[2]])

暫無
暫無

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

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