我想合并两个数据表,同时保持数据表的原始顺序。我还想在最后一列中说明两个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
答案 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