Как добиться этого результата в R - PullRequest
0 голосов
/ 13 апреля 2011

R Версия 2.11.1 32-разрядная в Windows 7

У меня есть два набора данных, как показано ниже:

data_set_A:

USER_B   ACTION
10       0.1
11       0.3
12       0.1

data_set_B:

USER_A   USER_B   ACTION
1        10       0.2
1        11       0.1
1        15       0.1
2        12       0.2     

Как добавить ACTION из USER_B из data_set_A в data_set_B? USER_B в data_set_A является подмножеством USER_B в data_set_B.

для приведенного выше примера это может быть:

USER_A   USER_B   ACTION
1        10       0.2+0.1
1        11       0.1+0.3
1        15       0.1
2        12       0.2+0.1 

В data_set_B Мне не нужно учитывать USER_A, просто учтите, что USER_B появляется в data_set_A.

Интересно, можно ли этого достичь, не делая по одному?

Ответы [ 2 ]

3 голосов
/ 13 апреля 2011
dfa <- data.frame(
        user_b = 10:12,
        action = c(0.1, 0.3, 0.1)
)

dfb <- data.frame(
        user_a = c(1, 1, 1, 2),
        user_b = c(10, 11, 15, 12),
        action = c(0.2, 0.1, 0.1, 0.2)
)


action <- dfa$action[match(dfb$user_b, dfa$user_b)]
action[is.na(action)] <- 0
dfb$action <- dfb$action + action
dfb

  user_a user_b action
1      1     10    0.3
2      1     11    0.4
3      1     15    0.1
4      2     12    0.3
2 голосов
/ 13 апреля 2011

Один из способов - выполнить слияние базы данных с двумя наборами данных, чтобы сформировать нужные пары действий, а затем суммировать их.Используя пример кода @ Andrie:

dfa <- data.frame(
        user_b = 10:12,
        action = c(0.1, 0.3, 0.1)
)

dfb <- data.frame(
        user_a = c(1, 1, 1, 2),
        user_b = c(10, 11, 15, 12),
        action = c(0.2, 0.1, 0.1, 0.2)
)

Код решения

Сначала я опишу полное решение, а затем объясню шаги:

mdat <- merge(dfb, dfa, by = "user_b", all.x = TRUE)
res <- data.frame(mdat[,c(2,1)],
                  action = rowSums(mdat[, c("action.x", "action.y")], 
                                   na.rm = TRUE))
res <- res[order(res$user_a, res$user_b),]

res сейчассодержит результаты.

Пояснение

Сначала мы объединяем два фрейма данных, сопоставляя их по user_b:

## merge the data
mdat <- merge(dfb, dfa, by = "user_b", all.x = TRUE)
mdat

, давая:

> mdat
  user_b user_a action.x action.y
1     10      1      0.2      0.1
2     11      1      0.1      0.3
3     12      2      0.2      0.1
4     15      1      0.1       NA

Затем мы просто используем этот объект для создания фрейма данных результата и суммируем два action. столбца по строкам:

## format the merged data with summed `action`
res <- data.frame(mdat[,c(2,1)],
                  action = rowSums(mdat[, c("action.x", "action.y")], 
                                   na.rm = TRUE))
## reorder
res <- res[order(res$user_a, res$user_b),]
res

, что приводит к

> res
  user_a user_b action
1      1     10    0.3
2      1     11    0.4
4      1     15    0.1
3      2     12    0.3
...