从 excel 复制 SUMIFS 的新计算列

New computed column replicating SUMIFS from excel

我有一个数据框(df)如下:

>date       fx      mkt_val
>03/01/2016 AUD     50
>03/01/2016 AUD     75
>03/01/2016 USD     100
>03/01/2016 USD     150
>03/02/2016 AUD     50
>03/02/2016 AUD     500
>03/02/2016 USD     150
>03/02/2016 USD     275

我希望能够有效地复制 excel 中的 SUMIFS 函数,以便我得到一个新列,其中包含每个日期的每个 fx 值的总和。这样输出将如下所示:

>date       fx  mkt_val sumifs
>03/01/2016 AUD   50    125
>03/01/2016 AUD   75    125
>03/01/2016 USD   100   250
>03/01/2016 USD   150   250
>03/02/2016 AUD   50    550
>03/02/2016 AUD   500   550
>03/02/2016 USD   150   425
>03/02/2016 USD   275   425

任何指向正确方向或代码的点都会有所帮助!谢谢。

使用 dplyr 库。请(通常)使用 dput 或其他直接可复制的方式提供数据,以使其更容易复制。

df <- read.delim(text="
date fx mkt_val
03/01/2016 AUD 50
03/01/2016 AUD 75
03/01/2016 USD 100
03/01/2016 USD 150
03/02/2016 AUD 50
03/02/2016 AUD 500
03/02/2016 USD 150
03/02/2016 USD 275
", sep=" ", row.names=NULL)

library(dplyr)

# summarize
summary <- df %>% 
  group_by(date, fx) %>%
  summarize(sumifs = sum(mkt_val)) 

# join back to the original
result <- df %>% 
  inner_join(summary, by=c("date", "fx"))

结果

        date  fx mkt_val sumifs
1 03/01/2016 AUD      50    125
2 03/01/2016 AUD      75    125
3 03/01/2016 USD     100    250
4 03/01/2016 USD     150    250
5 03/02/2016 AUD      50    550
6 03/02/2016 AUD     500    550
7 03/02/2016 USD     150    425
8 03/02/2016 USD     275    425

尝试ave。没有使用包。

transform(DF, sumif = ave(mkt_val, date, fx, FUN = sum))

给予:

        date  fx mkt_val sumif
1 03/01/2016 AUD      50   125
2 03/01/2016 AUD      75   125
3 03/01/2016 USD     100   250
4 03/01/2016 USD     150   250
5 03/02/2016 AUD      50   550
6 03/02/2016 AUD     500   550
7 03/02/2016 USD     150   425
8 03/02/2016 USD     275   425

注意: 可重现形式的输入是:

Lines <- "date       fx      mkt_val
03/01/2016 AUD     50
03/01/2016 AUD     75
03/01/2016 USD     100
03/01/2016 USD     150
03/02/2016 AUD     50
03/02/2016 AUD     500
03/02/2016 USD     150
03/02/2016 USD     275"
DF <- read.table(text = Lines, header = TRUE, as.is = TRUE)