Транспонировать список фреймов данных, таких как фреймы данных с заголовками - PullRequest
0 голосов
/ 12 марта 2020

У меня есть список информационных фреймов, и моя цель - перенести их в один. Как я мог это сделать? Ниже приведен мой список

$pri
$pri$x
  a b
1 1 3
2 2 4

$pri$y
  a b c
1 1 3 5
2 2 4 6


$sec
$sec$w
  a  b
1 7  9
2 8 10

$sec$z
   a  b  c  d
 1 11 13 15 17
 2 12 14 16 18

Я нацеливаю вывод следующим образом

  "col1" "col2"
a ; 1 ; 2
b ; 3 ; 4
a ; 1 ; 2
b ; 3 ; 4
c ; 5 ; 6
a ; 7 ; 8
b ; 9 ; 10
a ; 11 ; 12
b ; 13 ; 14
c ; 15 ; 16
d ; 17 ; 18

Ответы [ 3 ]

1 голос
/ 12 марта 2020
library(purrr)
pri <- 
  list(
    x = data.frame(a = 1:2, b = 3:4),
    y = data.frame(a = 1:2, b = 3:4, c = 5:6)
  )
sec <- 
  list(
    w = data.frame(a = 7:8, b = 9:10),
    z = data.frame(a = 11:12, b = 13:14, c = 15:16, d = 17:18)
  )

list(pri = pri, sec = sec) %>% flatten() %>% map(t) %>%  reduce(rbind)
#>   [,1] [,2]
#> a    1    2
#> b    3    4
#> a    1    2
#> b    3    4
#> c    5    6
#> a    7    8
#> b    9   10
#> a   11   12
#> b   13   14
#> c   15   16
#> d   17   18

Создано в 2020-03-12 пакетом представ (v0.3.0)

0 голосов
/ 12 марта 2020

Вы также можете решить свою проблему, используя базовые функции R следующим образом:

dfs <- list(pri = list(x = structure(list(a = 1:2, b = 3:4), class = "data.frame", row.names = c(NA, 
-2L)), y = structure(list(a = 1:2, b = 3:4, c = 5:6), class = "data.frame", row.names = c(NA, 
-2L))), sec = list(w = structure(list(a = 7:8, b = 9:10), class = "data.frame", row.names = c(NA, 
-2L)), z = structure(list(a = 11:12, b = 13:14, c = 15:16, d = 17:18), class = "data.frame", row.names = c(NA, 
-2L))))


t(Reduce(cbind, unlist(dfs, FALSE)))

#   [,1] [,2]
# a    1    2
# b    3    4
# a    1    2
# b    3    4
# c    5    6
# a    7    8
# b    9   10
# a   11   12
# b   13   14
# c   15   16
# d   17   18
0 голосов
/ 12 марта 2020

Предполагая, что ваши данные приведены так (в соответствии с вашим вопросом):

frame_list <- list(pri = list(x = structure(list(a = 1:2, b = 3:4), class = "data.frame", row.names = c(NA, 
-2L)), y = structure(list(a = 1:2, b = 3:4, c = 5:6), class = "data.frame", row.names = c(NA, 
-2L))), sec = list(w = structure(list(a = 7:8, b = 9:10), class = "data.frame", row.names = c(NA, 
-2L)), z = structure(list(a = 11:12, b = 13:14, c = 15:16, d = 17:18), class = "data.frame", row.names = c(NA, 
-2L))))

, тогда вы можете сделать:

df <- t(do.call('cbind', unlist(frame_list, recursive = FALSE)))
rownames(df) <- gsub('\\w+\\.\\w\\.', '', rownames(df))

Примечание : вывод будет быть матрицей. Если вам нужно преобразовать это в фрейм данных, вы можете использовать data.frame, но это изменит имена строк, добавив к ним некоторое число, чтобы сделать его уникальным.

Вывод:

  [,1] [,2]
a    1    2
b    3    4
a    1    2
b    3    4
c    5    6
a    7    8
b    9   10
a   11   12
b   13   14
c   15   16
d   17   18

Если вы хотите, чтобы это было в кадре данных, вы можете сделать:

df <- data.frame(t(do.call('cbind', unlist(frame_list, recursive = FALSE))), stringsAsFactors = FALSE)
df$newcol <- gsub('\\w+\\.\\w\\.', '', rownames(df))
rownames(df) <- NULL

Вывод:

   X1 X2 newcol
1   1  2      a
2   3  4      b
3   1  2      a
4   3  4      b
5   5  6      c
6   7  8      a
7   9 10      b
8  11 12      a
9  13 14      b
10 15 16      c
11 17 18      d
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...