我想得出的结果先前已经在以下问题中得到了解决:Is there an R function mirroring EXCEL COUNTIFS with date range as condition?
我有两个单独的数据帧作为输入:TOTALREV
和TOTALLISTINGS
,它们都以简化形式看起来像这样:
TOTALREV
listing_id reviewer_id reviewer_name review_date
1 2818 10952 Lam 2009-03-30
2 2818 12798 Alice 2009-04-24
3 2818 11869 Natalja 2009-05-03
4 2818 14064 Enrique 2009-05-18
5 2818 17977 Sherwin 2009-05-25
6 2818 20192 Jie 2009-06-29
和
TOTALLISTINGS
listing_id last_scraped.calc
1 2818 2019-03-07
2 20168 2019-03-07
3 25428 2019-03-07
4 27886 2019-03-07
5 28658 2019-03-07
6 28871 2019-03-07
请注意,每个last_scraped.calc
我确实有多个listing_id
因此,我真正需要的是对review_date
中的listing_id
与TOTALLISTINGS
中的listing_id
匹配的TOTALREV
的所有条目进行计数的代码, review_date
中的TOTALREV
距last_scraped.calc
中的各个TOTALLISTINGS
最多30天
这样我的预期输出将是:
REVIEWCOUNT
listing_id last_scraped.calc reviews_last30
<dbl> <date> <int>
1 1 2016-11-15 1
2 1 2016-11-20 1
3 2 2016-11-15 3
4 2 2016-11-20 2
在上一个线程中,“ mfidino”已经帮助我提出了以下代码,这些代码在我编译完全相同类型的一些额外数据之前可以正常工作:
library(lubridate)
library(dplyr)
genlistings <- function(TOTALLISTINGS = NULL, TOTALREV = NULL){
# tibble to return
to_return <- TOTALREV %>%
inner_join(., TOTALLISTINGS, by ='listing_id') %>%
group_by(listing_id, last_scraped.calc) %>%
summarise(
reviews_last30 = sum((review_date >= (last_scraped.calc-30) & (review_date <= last_scraped.calc))))
return(to_return)
}
REVIEWCOUNT <- genlistings(TOTALREV, TOTALLISTINGS)
但是,现在运行上面的代码时,我的R仅返回以下内容,而不是上面REVIEWCOUNT
所示的建议输出:
head(REVIEWCOUNT)
reviews_last30
1 1018668
因此,不幸的是,我认为代码并没有真正地按listing_id
或last_scraped.calc
进行分组,而仅汇总了满足上述条件的所有评论。
非常感谢您的帮助-预先感谢!
答案 0 :(得分:0)
您可以先merge
两个表,然后对不超过30天的表使用table
来获取频率。 (我将最长天数从30天更改为3580,以便从您的示例数据中获取输出。)
TOTALREV <- read.table(header=TRUE, text="listing_id reviewer_id reviewer_name review_date
1 2818 10952 Lam 2009-03-30
2 2818 12798 Alice 2009-04-24
3 2818 11869 Natalja 2009-05-03
4 2818 14064 Enrique 2009-05-18
5 2818 17977 Sherwin 2009-05-25
6 2818 20192 Jie 2009-06-29")
TOTALLISTINGS <- read.table(header=TRUE, text="listing_id last_scraped.calc
1 2818 2019-03-07
2 20168 2019-03-07
3 25428 2019-03-07
4 27886 2019-03-07
5 28658 2019-03-07
6 28871 2019-03-07")
#Change to Date to allow calculating difference
TOTALREV$review_date <- as.Date(TOTALREV$review_date)
TOTALLISTINGS$last_scraped.calc <- as.Date(TOTALLISTINGS$last_scraped.calc)
me <- merge(TOTALREV, TOTALLISTINGS,)
#maxDays <- 30
maxDays <- 3580
data.frame(with(me[abs(me$review_date - me$last_scraped.calc)<=maxDays,], table(listing_id, last_scraped.calc)))
# listing_id last_scraped.calc Freq
#1 2818 2019-03-07 3