объединить две таблицы данных в одну, с чередующимися столбцами в R - PullRequest
0 голосов
/ 06 июня 2019

У меня есть две таблицы данных, odd_data и even_data.Я хотел бы объединить / объединить их в один all_data, где нечетные столбцы all_data - это столбцы odd_data, а четные столбцы - это столбцы even_data.Однако, то, что я пытаюсь, выдает ошибку.

Допустим, odd_data и even_data выглядят так:

odd_data
   col_1 col_3
    11    13
    21    23
    31    33

even_data
  col_2 col_4
    12    14
    22    24
    32    34

Где желаемый результат выглядит так:

all_data
   col_1 col_2 col_3 col_4
    11    12    13    14
    21    22    23    24
    31    32    33    34

Я попробовал следующее:

odd_data = data.table(col_1 = c(11, 21, 31),
                      col_3 = c(13, 23, 33))


even_data = data.table(col_2 = c(12, 22, 32),
                       col_4 = c(14, 24, 34))

all_data <- data.table(matrix(nrow = nrow(odd_data), ncol = (ncol(odd_data)*2)))
# change the name of columns of all_data to match column names of odd/even_data
colnames_data <- colnames(all_data)
setnames(all_data, old=colnames_data[c(TRUE, FALSE)], new= colnames(odd_data))
setnames(all_data, old=colnames_data[c(FALSE, TRUE)], new= colnames(even_data))

all_data[, c(rep(c(TRUE, FALSE), 2))] <- odd_data

Ошибка

Error in `[<-.data.table`(`*tmp*`, , c(rep(c(TRUE, FALSE), 2)), value = list( : 
  j must be vector of column name or positions

Ответы [ 2 ]

2 голосов
/ 06 июня 2019

Вы можете просто cbind их и затем изменить порядок столбцов:

neworder <- order(c(2*(seq_along(odd_data) - 1) + 1,
                    2*seq_along(even_data)))
cbind(odd_data, even_data)[,neworder]
#    col_1 col_2 col_3 col_4
# 1:    11    12    13    14
# 2:    21    22    23    24
# 3:    31    32    33    34

Объяснение:

### count by odds
2*(seq_along(odd_data) - 1) + 1
# [1] 1 3

### count by evens
2*seq_along(even_data)
# [1] 2 4

neworder
# [1] 1 3 2 4

Это дает нам порядок столбцов, который мы хотим вконец: первый столбец (col_1), третий столбец (col_2, поскольку он находится после всех столбцов первой таблицы) и т. д.

Для проверки можно сгенерировать два асимметричных примера:

odd_data = data.table(col_1 = c(11, 21, 31),
                      col_3 = c(13, 23, 33),
                      col_5 = c(15, 25, 35))
even_data = data.table(col_2 = c(12, 22, 32),
                       col_4 = c(14, 24, 34))
neworder <- order(c(2*(seq_along(odd_data) - 1) + 1,
                    2*seq_along(even_data)))
cbind(odd_data, even_data)[,neworder]
#    col_1 col_2 col_3 col_4 col_5
# 1:    11    12    13    14    15
# 2:    21    22    23    24    25
# 3:    31    32    33    34    35

Далее, 3 и 3:

odd_data = data.table(col_1 = c(11, 21, 31),
                      col_3 = c(13, 23, 33),
                      col_5 = c(15, 25, 35))
even_data = data.table(col_2 = c(12, 22, 32),
                       col_4 = c(14, 24, 34),
                       col_6 = c(16, 26, 36))

neworder <- order(c(2*(seq_along(odd_data) - 1) + 1,
                    2*seq_along(even_data)))
cbind(odd_data, even_data)[,neworder]
#    col_1 col_2 col_3 col_4 col_5 col_6
# 1:    11    12    13    14    15    16
# 2:    21    22    23    24    25    26
# 3:    31    32    33    34    35    36

Теперь, если мы хотим попробовать испортить систему, имея больше четных , чем шансов (что "не должно происходить"):

odd_data = data.table(col_1 = c(11, 21, 31),
                      col_3 = c(13, 23, 33),
                      col_5 = c(15, 25, 35))
even_data = data.table(col_2 = c(12, 22, 32),
                       col_4 = c(14, 24, 34),
                       col_6 = c(16, 26, 36),
                       col_8 = c(18, 28, 38))

neworder <- order(c(2*(seq_along(odd_data) - 1) + 1,
                    2*seq_along(even_data)))
cbind(odd_data, even_data)[,neworder]
#    col_1 col_2 col_3 col_4 col_5 col_6 col_8
# 1:    11    12    13    14    15    16    18
# 2:    21    22    23    24    25    26    28
# 3:    31    32    33    34    35    36    38

Таким образом, хотя технически col_8 не является восьмым столбцом, порядок всех остальных столбцов все еще сохраняется.

0 голосов
/ 07 июня 2019

вы можете использовать bind_cols из пакета dplyr следующим образом

bind_cols(odd_data,even_data)[,c(1,3,2,4)]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...