Как объединить несколько data.frames с Reduce и получить упорядоченный вывод? - PullRequest
0 голосов
/ 09 февраля 2019

Существует классический подход , как объединить несколько фреймов данных в списке .

Вывод, однако, несколько неупорядочен.

Пример

> L
[[1]]
  a b c  d e
1 5 2 4 10 1

[[2]]
  a b c d e
1 6 7 4 6 1

[[3]]
  a b c d
1 7 3 5 5

[[4]]
  a b c d
1 5 2 6 5

[[5]]
  a b c d
1 4 4 2 8

Строки вывода Reduce(.) упорядочены по 5, 1, 4, 2, 3, что может означать, что сокращение работает как-то изснаружи внутрь.

> Reduce(function(...) merge(..., all=TRUE), L)
> Reduce(function(x, y) merge(x, y, all=TRUE, by=intersect(names(x), names(y))), L)  # same
  a b c  d  e
1 4 4 2  8 NA
2 5 2 4 10  1
3 5 2 6  5 NA
4 6 7 4  6  1
5 7 3 5  5 NA

В любом случае, есть ли способ немного изменить код, чтобы получить упорядоченный вывод, подобный приведенному ниже?

#   a b c  d  e
# 1 5 2 4 10  1
# 2 6 7 4  6  1
# 3 7 3 5  5 NA
# 4 5 2 6  5 NA
# 5 4 4 2  8 NA

Данные

L <- list(structure(list(a = 5L, b = 2L, c = 4L, d = 10L, e = 1L), class = "data.frame", row.names = c(NA, 
-1L)), structure(list(a = 6L, b = 7L, c = 4L, d = 6L, e = 1L), class = "data.frame", row.names = c(NA, 
-1L)), structure(list(a = 7L, b = 3L, c = 5L, d = 5L), class = "data.frame", row.names = c(NA, 
-1L)), structure(list(a = 5L, b = 2L, c = 6L, d = 5L), class = "data.frame", row.names = c(NA, 
-1L)), structure(list(a = 4L, b = 4L, c = 2L, d = 8L), class = "data.frame", row.names = c(NA, 
-1L)))

Ответы [ 2 ]

0 голосов
/ 09 февраля 2019

Это происходит из-за sort из merge:

sort - логический.Должен ли результат сортироваться по столбцам?

Итак, вместо этого вы можете использовать

Reduce(function(...) merge(..., all = TRUE, sort = FALSE), L)
#   a b c  d  e
# 1 5 2 4 10  1
# 2 6 7 4  6  1
# 3 7 3 5  5 NA
# 4 5 2 6  5 NA
# 5 4 4 2  8 NA
0 голосов
/ 09 февраля 2019

Здесь я использую bind_rows из пакета dplyr вместо merge.

L <- list(structure(list(a = 5L, b = 2L, c = 4L, d = 10L, e = 1L), class = "data.frame", row.names = c(NA, 
          -1L)), structure(list(a = 6L, b = 7L, c = 4L, d = 6L, e = 1L), class = "data.frame", row.names = c(NA, 
          -1L)), structure(list(a = 7L, b = 3L, c = 5L, d = 5L), class = "data.frame", row.names = c(NA, 
          -1L)), structure(list(a = 5L, b = 2L, c = 6L, d = 5L), class = "data.frame", row.names = c(NA, 
          -1L)), structure(list(a = 4L, b = 4L, c = 2L, d = 8L), class = "data.frame", row.names = c(NA, 
          -1L)))

library(dplyr)

Reduce(bind_rows, L) 
#>   a b c  d  e
#> 1 5 2 4 10  1
#> 2 6 7 4  6  1
#> 3 7 3 5  5 NA
#> 4 5 2 6  5 NA
#> 5 4 4 2  8 NA

Создано в 2019-02-09 пакетом Представить (v0.2.1.9000)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...