Подобные вещи довольно легко сделать с помощью операций, подобных базам данных.Здесь я использую пакет sqldf
, чтобы выполнить левое (внешнее) соединение, а затем суммировать полученный объект:
require(sqldf)
tmp <- sqldf("select * from data_A left join data_B using (USER_A, USER_B)")
Это приводит к:
> tmp
USER_A USER_B ACTION ACTION
1 1 11 0.30 NA
2 1 13 0.25 0.17
3 1 16 0.63 NA
4 1 17 0.26 NA
5 2 11 0.14 0.25
6 2 14 0.28 NA
Теперь нам просто нужно сложитьдва ACTION
столбца:
data_C <- transform(data_A, ACTION = rowSums(tmp[, 3:4], na.rm = TRUE))
, что дает желаемый результат:
> data_C
USER_A USER_B ACTION
1 1 11 0.30
2 1 13 0.42
3 1 16 0.63
4 1 17 0.26
5 2 11 0.39
6 2 14 0.28
Это можно сделать с помощью стандартной функции R merge
:
> merge(data_A, data_B, by = c("USER_A","USER_B"), all.x = TRUE)
USER_A USER_B ACTION.x ACTION.y
1 1 11 0.30 NA
2 1 13 0.25 0.17
3 1 16 0.63 NA
4 1 17 0.26 NA
5 2 11 0.14 0.25
6 2 14 0.28 NA
Таким образом, мы можем заменить приведенный выше вызов sqldf()
на:
tmp <- merge(data_A, data_B, by = c("USER_A","USER_B"), all.x = TRUE)
, в то время как вторая строка, использующая transform()
, останется прежней.