Создать список data.frames с указанными c строками из списка data.frames - PullRequest
2 голосов
/ 26 февраля 2020

У меня есть несколько data.frames, хранящихся в списке (list1), и я хотел бы создать новый список (list2) с data.frames, где первый содержит все первые строки data.frames в list1, второй содержит все вторые строки et c. Вот пример:

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

Ответы [ 3 ]

2 голосов
/ 26 февраля 2020

Если у всех одинаковое количество строк

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)}
1 голос
/ 26 февраля 2020
d = lapply(list1, asplit, 1)
Map(rbind, d[[1]], d[[2]])
1 голос
/ 26 февраля 2020

Предполагая, что все кадры данных имеют одинаковое количество строк и столбцов, работает следующее:

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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...