Предположим, у меня есть data.table в R:
> A=data.table(Col1=c(1,4,2,5,6,2,3,5,3,7))
> A
Col1
1: 1
2: 4
3: 2
4: 5
5: 6
6: 2
7: 3
8: 5
9: 3
10: 7
И ключ-значение data.table, где
> B=data.table(Col1=c(1,2,3,4,5,6,7),Col2=c("A","B","C","D","E","F","G"))
> B
Col1 Col2
1: 1 A
2: 2 B
3: 3 C
4: 4 D
5: 5 E
6: 6 F
7: 7 G
Я хотел бы получить ссылку Col1
из data.table A
и создать новый столбец в B
, который соответствует парам ключ-значение:
Col1 Col2
1: 1 A
2: 4 D
3: 2 B
4: 5 E
5: 6 F
6: 2 B
7: 3 C
8: 5 E
9: 3 C
10: 7 G
Как я могу сделать это в data.table? Спасибо
Вы хотите присоединиться к обновлению. Изучите виньетки на упаковке.
Я действительно чувствую, что это обман ссылки Шри, но ни один из этих ответов на самом деле не демонстрирует назначение слияния ответа Вимпела (например, A[B, Col2 := i.Col2, on = .(Col1)]
). Вот (возможно) более каноническая ссылка: stackoverflow.com/q/34598139/3358272
Использование аргумента data.table
s on
library(data.table)
A[B, , on = "Col1"]
Col1 Col2
1: 1 A
2: 2 B
3: 2 B
4: 3 C
5: 3 C
6: 4 D
7: 5 E
8: 5 E
9: 6 F
10: 7 G
То, что вы ищете, - это соединение по ссылке/обновлению.
Это ищет значение A$Col1 в B$Col1 и возвращает первое совпадение B$Col2 (поэтому, если есть >1 совпадений, возвращаемое значение зависит от того, как упорядочено B). В коде это обозначается как i.Col2
, поскольку B находится в i
-части синтаксиса data.table. Обычно это самый быстрый способ присоединиться, но помните, что он возвращает только первое совпадение. ТАК, если есть несколько значений B$Col2 для одного и того же значения B$Col1, вы получите только одно (самое верхнее) значение.
A[B, Col2 := i.Col2, on = .(Col1)]
Col1 Col2
1: 1 A
2: 4 D
3: 2 B
4: 5 E
5: 6 F
6: 2 B
7: 3 C
8: 5 E
9: 3 C
10: 7 G
Посмотрите на
?merge