[英]R - 2 dataframes, sum values on dataframe 2 between dates on dataframe 1 matching ID#
我有2個數據框。
data frame 1 includes : ID, date1, date2
data frame 2 includes : ID, date , amount
我想在數據框1中創建另一列,以對數據框2 date1
於date1
和date2
之間的金額求和,並match ID
數據框1 match ID
。
我已經嘗試過使用dplyr的一些方法,包括使用lubridate在數據幀1中創建一個間隔列,但是仍然lubridate
這個問題。
另外,我應該提到數據框2的每個ID都有多個列表。 它具有當月每個ID的每天金額。 因此,它類似於excel中的sumifs函數,但對於R。如果id匹配且日期為btw date1和date2,則將df2中的所有金額相加。
基於dplyr
的解決方案可以是:
library(dplyr)
df2 %>% left_join(df1, by="ID") %>%
filter(between(date, date1, date2) %>%
group_by(date) %>%
mutate(sum_amount = sum(amount))
注意:上述解決方案假定date
, date1
和date2
為Date
類型或POSIXct
類型。
這是使用Fuzzyjoin包的示例。
library(tibble)
library(lubridate)
library(fuzzyjoin)
df1 <- tibble(
id = c("I1", "I2", "I3"),
date1 = ymd(c("2006-01-01", "2007-01-01", "2008-01-01")),
date2 = ymd(c("2006-12-31", "2007-12-31", "2008-12-31"))
)
df2 <- tibble(
id = c("I1", "I1", "I2", "I2", "I3", "I3"),
datetrans = ymd(c("2006-06-06", "2008-03-31", "2007-05-04",
"2007-08-09", "2009-01-01", "2009-10-12")),
amount = c(100, 150, 75, 100, 200, 200)
)
df3 <- fuzzy_inner_join(df2, df1,
by = c("id" = "id",
"datetrans" = "date1", "datetrans" = "date2"),
match_fun = list(`==`, `>=`, `<=`))
df3 <- df3 %>%
group_by(id.x) %>%
summarise(amount = sum(amount))
colnames(df3) <- c("id", "amount")
result <- left_join(df1, df3)
創建了數據集df1和df2。 請注意,對於ID I3,在date1和date2之間沒有出現“日期”。
我們首先找到df2和df1之間的所有記錄,其中id的匹配項和datetrans變量在date1和date2之間。 我們通過id匯總結果將結果分組。 最后,將此數據集合並回df1以獲取所需的輸出。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.