RStudio:两个不同长度的数据集的总和

时间:2018-03-14 17:01:13

标签: r sum aggregate

我有两个数据集A和B:

数据集A(称为Sales)具有以下数据:

ID   Person    Sales
1      1        100
2      2        300
3      3        400
4      4        200
5      5        50

数据集B(称为Account_Scenarios)具有以下数据(注意 - 数据集B中有更多行,我刚刚包含前6个):

ID   Scenario Person    Upkeep
1        1      1        -10
2        1      2        -200
3        2      1        -150
4        3      4        -50
5        3      3        -100
6        4      5        -500

我想在数据集B中添加一个名为'Profit'的列,这样我就可以看到每个方案的每人利润(Profit = Sales + Upkeep)。例如如下:

ID   Scenario Person    Upkeep   Profit
1        1      1        -10       90
2        1      2        -200      100
3        2      1        -150      -50
4        3      4        -50       150
5        3      3        -100      300
6        4      5        -500      -450

最好的方法是什么?我是R的新手并尝试使用聚合函数,但它要求参数长度相同。

Account_Scenarios$Profit <- aggregate(Sales[,c('Sales')], Account_Scenarios[,c('Upkeep')], by=list(Sales$Person), 'sum')

3 个答案:

答案 0 :(得分:1)

假设Sales$Person只有唯一值,您可以:

Account_Scenarios$Profit=Account_Scenarios$Upkeep-Sales$Sales[sapply(Account_Scenarios$Person,function(x)which(Sales$Person==x))]

答案 1 :(得分:1)

我会left_join两个数据集库Person变量,然后计算利润:

library(tidyverse)
A <- A %>% select(Person, Sales) # Only need the two variables for the join
df <- left_join(B, A, by = "Person") %>%
    mutate(Profit = Sales + Upkeep) 

答案 2 :(得分:1)

解决方案可以使用sqldf库(sql样式join):

library(sqldf)

A <- data.frame(Person=1:5, Sales=c(100,300,400,200,50)) 
B <- data.frame(Scenario=c(1,1,2,3,3,4), Person=c(1,2,1,4,3,5), Upkeep=c(-10,-200,-150,-50,-100,-500))
B <- sqldf("SELECT B.*, A.Sales + B.Upkeep as Profit FROM B JOIN A on B.Person = A.Person")