如何在R中实现这个结果

发布于 2024-11-01 04:10:05 字数 841 浏览 1 评论 0原文

Windows 7 上的 R 版本 2.11.1 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     

如何从 data_set_A 添加 USER_BACTIONdata_set_Bdata_set_A 中的 USER_Bdata_set_BUSER_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出现在中>数据集_A

请问不一一做是否可以实现呢?

R Version 2.11.1 32-bit on Windows 7

I have two data sets as shown below:

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     

How to add the ACTION of USER_B from data_set_A to data_set_B? The USER_B in data_set_A is a subset of USER_B in data_set_B.

for the example above, it may be:

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 

In data_set_B I don't need to consider the USER_A, just consider the USER_B appear in data_set_A.

I wonder if it could be achieved without doing one by one?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

↙温凉少女 2024-11-08 04:10:05
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
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
裂开嘴轻声笑有多痛 2024-11-08 04:10:05

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

One way is to do the equivalent of a database merge on the two data sets to form the action pairs you want and then sum those. Using @Andrie's example code:

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)
)

Solution Code

I'll first present the full solution and then explain the steps:

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 now contains the results.

Explanation

We first merge the two data frames, matching on user_b:

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

giving:

> 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

Then we just use this object to create the result data frame, and sum the two action. columns row-wise:

## 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

resulting in

> 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
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文