У меня есть policyData, который является моим очень большим набором данных (миллионы строк), и я хочу добавить к нему некоторую информацию с помощью таблицы сопоставления (десятки тысяч строк).
Пример:
policyData <- data.table(plan=c("c","b","b","d"),v=c(8,7,5,6),foo=c(4,2,8,3))
mapping <- data.table(plan=c("b","b","a","a","c","c"),a=c(1,2,4,5,7,8),b=c(9,8,6,5,3,2))
policyData:
plan v foo
1: c 8 4
2: b 7 2
3: b 5 8
4: d 6 3
mapping:
plan a b
1: b 1 9
2: b 2 8
3: a 4 6
4: a 5 5
5: c 7 3
6: c 8 2
Проблема состоит в том, что отображение имеет несколько экземпляров, и я желаючтобы получить только первый матч.И мне нужно объединить два, используя эффективный способ памяти, используя :=
.
. Желаемый вывод:
plan v foo a b
1: c 8 4 7 3
2: b 7 2 1 9
3: b 5 8 1 9
4: d 6 3 NA NA
Я пробовал:
policyData[mapping, on="plan", `:=`(a=i.a, b=i.b)]
, которыйдает последний экземпляр в таблице сопоставления:
plan v foo a b
1: c 8 4 8 2
2: b 7 2 2 8
3: b 5 8 2 8
4: d 6 3 NA NA
Я также попытался:
policyData[mapping, on="plan", `:=`(a=i.a, b=i.b), mult="first"]
, что дает странный результат (второй «b» не может соответствовать сопоставлению):
plan v foo a b
1: c 8 4 8 2
2: b 7 2 2 8
3: b 5 8 NA NA
4: d 6 3 NA NA
Любое понимание будет полезно.Я уже сделал много поисков.