从 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)
我有一个数据框(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)