我有两个数据帧。
data frame 1 includes : ID, date1, date2
data frame 2 includes : ID, date , amount我想在数据帧1中创建另一个列,它汇总了数据帧2中date1和date2之间的数量,以及数据帧1中的match ID。
我尝试了一些使用dplyr的方法,包括使用lubridate在数据帧1中创建一个间隔列,但仍然无法解决。
另外,我需要指出的是,数据框2中的每个ID都有多个列表,每个ID在一个月内每天都有相应的金额。这就像excel中的sumifs函数,但对于R,如果id匹配,日期是btw、date1和date2,则求df2中的所有金额之和。
发布于 2018-04-18 03:12:43
基于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类型。
发布于 2018-04-18 03:32:46
下面是一个使用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日期,在date1和date2之间没有出现“I3”。
我们通过id对结果进行分组,并将数量相加。最后,将此数据集合并回df1以获得所需的输出。
https://stackoverflow.com/questions/49885429
复制相似问题