R函数镜像COUNTIFS产生错误结果

时间:2019-05-29 09:58:06

标签: r countif

我想得出的结果先前已经在以下问题中得到了解决:Is there an R function mirroring EXCEL COUNTIFS with date range as condition?

我有两个单独的数据帧作为输入:TOTALREVTOTALLISTINGS,它们都以简化形式看起来像这样:

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_idTOTALLISTINGS中的listing_id匹配的TOTALREV的所有条目进行计数的代码, review_date中的TOTALREVlast_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_idlast_scraped.calc进行分组,而仅汇总了满足上述条件的所有评论。

非常感谢您的帮助-预先感谢!

1 个答案:

答案 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