簡體   English   中英

R-2個數據框,數據框2上與ID#匹配的日期之間的數據框2上的求和值

[英]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 date1date1date2之間的金額求和,並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))

注意:上述解決方案假定datedate1date2Date類型或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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM