首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >R-2数据帧,数据帧2上数据帧1的日期之间的总和值与ID#匹配

R-2数据帧,数据帧2上数据帧1的日期之间的总和值与ID#匹配
EN

Stack Overflow用户
提问于 2018-04-18 02:47:44
回答 2查看 450关注 0票数 0

我有两个数据帧。

代码语言:javascript
复制
data frame 1 includes : ID, date1, date2
data frame 2 includes : ID, date , amount

我想在数据帧1中创建另一个列,它汇总了数据帧2中date1date2之间的数量,以及数据帧1中的match ID

我尝试了一些使用dplyr的方法,包括使用lubridate在数据帧1中创建一个间隔列,但仍然无法解决。

另外,我需要指出的是,数据框2中的每个ID都有多个列表,每个ID在一个月内每天都有相应的金额。这就像excel中的sumifs函数,但对于R,如果id匹配,日期是btw、date1和date2,则求df2中的所有金额之和。

EN

回答 2

Stack Overflow用户

发布于 2018-04-18 03:12:43

基于dplyr的解决方案可以是:

代码语言:javascript
复制
library(dplyr)

df2 %>% left_join(df1, by="ID") %>%
  filter(between(date, date1, date2) %>%
  group_by(date) %>%
  mutate(sum_amount = sum(amount))

注意:上述解决方案假设datedate1date2的类型为DatePOSIXct类型。

票数 0
EN

Stack Overflow用户

发布于 2018-04-18 03:32:46

下面是一个使用fuzzyjoin包的示例。

代码语言:javascript
复制
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以获得所需的输出。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/49885429

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档