Вы можете просто 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
не является восьмым столбцом, порядок всех остальных столбцов все еще сохраняется.