合并data.tables,同时保持R中的原始顺序

时间:2020-02-09 14:47:53

标签: r merge data.table

我想合并两个数据表,同时保持数据表的原始顺序。我还想在最后一列中说明两个ID是否彼此匹配。所有这些都保持了data.table的原始顺序。

测试data.table显示了我遇到的问题,当您合并两个data.tables时,行的顺序有时会有所不同。

If(g1.label == g2.label)then(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 个答案:

答案 0 :(得分:2)

一种选择是将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 :(得分:1)

使用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