Объединять data.tables, сохраняя оригинальный порядок в R - PullRequest
0 голосов
/ 09 февраля 2020

Я хотел бы объединить две таблицы данных, сохраняя при этом исходный порядок таблиц данных. Я также хотел бы иметь последний столбец, чтобы сказать, соответствуют ли два идентификатора друг другу. Все это при сохранении исходного порядка data.table.

Проверка data.table показывает проблему, которая возникает у меня, когда вы объединяете две таблицы data.table, порядок строк иногда будет другим.

Если (g1.label == g2.label), то (match == "T")

library(data.table)

set.seed(100)

dt <- data.table(g1=c("A", "B", "C", "D", "E", "F", "L", "O", "P", "J"), 
                 g2=c("G", "D", "C", "H", "K", "J", "L", "U", "I", "R"),
                 value= rnorm(10))

ids <- data.table(labels=c("A", "B", "C", "D", "E", "F", "L", "O", 
                           "P", "J", "G", "H", "K", "U", "I", "R"),
                  ids=c(1:16))

test <- merge(dt, ids, by.x="g1", by.y="labels")
test2 <- merge(dt, ids, by.x="g2", by.y="labels")

# Desired output with original order
g1 g2 value g1.label g2.label match
A  G -0.50219235 1  11 F
B  D  0.13153117 2  4  F
C  C -0.07891709 3  3  T
D  H  0.88678481 4  12 F
E  K  0.86014084 5  13 F
F  J  1.09086728 6  10 F
L  L  1.42053190 7  7  T
O  U  0.93415334 8  14 F
P  I  0.22375495 9  15 F
J  R -0.35749574 10 16 F

Ответы [ 2 ]

2 голосов
/ 10 февраля 2020

Можно передать sort=FALSE в merge:

test <- merge(dt, ids, by.x="g1", by.y="labels", sort=FALSE)
test2 <- merge(test, ids, by.x="g2", by.y="labels", sort=FALSE)
test2[, match := ids.x==ids.y]

Другой вариант - использовать объединение обновлений:

dt[ids, on=c("g1"="labels"), ids.x := ids]
dt[ids, on=c("g2"="labels"), ids.y := ids]
dt[, match := ids.x==ids.y]

вывод test2:

    g2 g1       value ids.x ids.y match
 1:  G  A -0.50219235     1    11 FALSE
 2:  D  B  0.13153117     2     4 FALSE
 3:  C  C -0.07891709     3     3  TRUE
 4:  H  D  0.88678481     4    12 FALSE
 5:  K  E  0.11697127     5    13 FALSE
 6:  J  F  0.31863009     6    10 FALSE
 7:  L  L -0.58179068     7     7  TRUE
 8:  U  O  0.71453271     8    14 FALSE
 9:  I  P -0.82525943     9    15 FALSE
10:  R  J -0.35986213    10    16 FALSE
1 голос
/ 09 февраля 2020

Решение с использованием dplyr:

library(data.table)

set.seed(100)

dt <- data.table(g1=c("A", "B", "C", "D", "E", "F", "L", "O", "P", "J"), 
                 g2=c("G", "D", "C", "H", "K", "J", "L", "U", "I", "R"),
                 value= rnorm(10))

ids <- data.table(labels=c("A", "B", "C", "D", "E", "F", "L", "O", 
                           "P", "J", "G", "H", "K", "U", "I", "R"),
                  ids=c(1:16))

dt %>% 
  left_join(ids, by= c("g1"="labels")) %>% 
  mutate(label_match = g1 == g2)

Что возвращает:

    g1 g2      value ids label_match
1   A  G -0.50219235   1       FALSE
2   B  D  0.13153117   2       FALSE
3   C  C -0.07891709   3        TRUE
4   D  H  0.88678481   4       FALSE
5   E  K  0.11697127   5       FALSE
6   F  J  0.31863009   6       FALSE
7   L  L -0.58179068   7        TRUE
8   O  U  0.71453271   8       FALSE
9   P  I -0.82525943   9       FALSE
10  J  R -0.35986213  10       FALSE
...