R rbind при сохранении порядка или строк в каждом фрейме данных - PullRequest
0 голосов
/ 14 февраля 2019

Мне нужно объединить 2 фрейма данных, сохраняя их порядок появления в каждом фрейме данных:

x = data.frame(a=1:3, b=2:4, c=3:5)
y = data.frame(a=c(10, 20, 30), b=c(20, 30, 40), c=c(30, 40, 50))

Что я хочу:

> z 

a   b   c
1   2   3
10  20  30
2   3   4
20  30  40
3   4   5
30  40  50

Но rbind делает этодобавление второго кадра данных под первым.

Ответы [ 5 ]

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

Только для полноты, также решение data.table.

library(data.table)
dt.x <- data.table(x)
dt.y <- data.table(y)
dt.x[,Row.Num :=seq(1:.N)]
dt.y[,Row.Num :=seq(1:.N)]
rbindlist(list(dt.x,dt.y), idcol = TRUE)[order(Row.Num),]
0 голосов
/ 14 февраля 2019

Как еще одна базовая версия r:

x = data.frame(a=1:3, b=2:4, c=3:5)
y = data.frame(a=c(10, 20, 30), b=c(20, 30, 40), c=c(30, 40, 50))

mapply(FUN = function(i,j){rbind(i,j)}, x, y)
#>       a  b  c
#> [1,]  1  2  3
#> [2,] 10 20 30
#> [3,]  2  3  4
#> [4,] 20 30 40
#> [5,]  3  4  5
#> [6,] 30 40 50

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

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

Вы можете использовать идею номера строки из Paweł в базе R:

x$rowid <- seq(1, nrow(x)*2, by = 2) # or simply 1:nrow(x)
y$rowid <- seq(2, nrow(y)*2, by = 2)
z <- rbind(x, y)
z[order(z$rowid),]

   a  b  c rowid
1  1  2  3     1
4 10 20 30     2
2  2  3  4     3
5 20 30 40     4
3  3  4  5     5
6 30 40 50     6

edit также можете использовать имена строк, сгенерированные rbind ():

z <- do.call(rbind, list(x = x, x = y))
z[order(rownames(z)), ]

      a  b  c
x.1   1  2  3
x.11 10 20 30
x.2   2  3  4
x.21 20 30 40
x.3   3  4  5
x.31 30 40 50
0 голосов
/ 14 февраля 2019

Попробуйте этот однострочный

do.call("rbind", Map("rbind", split(x, 1:nrow(x)), split(y, 1:nrow(y))))

, который дает эти data.frame, если x и y такие же, как в вопросе:

      a  b  c
1.1   1  2  3
1.2  10 20 30
2.2   2  3  4
2.21 20 30 40
3.3   3  4  5
3.31 30 40 50

Он разбивает все данныекадр за строкой, а затем будет привязывать соответствующие компоненты разбиений.Тогда это связывает все это.Обратите внимание, что этот однострочник работает, даже если столбцы имеют разные типы.Например, это будет работать, даже если:

x <- data.frame(a = letters[1:3], b = 1:3, c = c(TRUE, FALSE, TRUE))
y <- data.frame(a = LETTERS[1:3], b = 11:13, c = c(FALSE, TRUE, FALSE))
0 голосов
/ 14 февраля 2019

Необходимо добавить переменную номера строки в каждый фрейм данных и отсортировать по этой переменной после привязки.С dplyr вы можете сделать это следующим образом:

library(dplyr)

x %>%
  mutate(rn = row_number()) %>%
  bind_rows(
    y %>%
      mutate(rn = row_number())
  ) %>%
  arrange(rn)%>%
  select(-4)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...