如何在R中实现这个结果

时间:2011-04-13 10:18:40

标签: r algorithm statistics dataset

R版本2.11.1 Windows 7上的32位

我有两个数据集,如下所示:

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_Bdata_set_A添加到data_set_BUSER_B中的data_set_AUSER_Bdata_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 个答案:

答案 0 :(得分:3)

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

答案 1 :(得分:2)

一种方法是在两个数据集上进行数据库合并,以形成所需的操作对,然后对它们求和。使用@ 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