如何在 SUMIFS 中设置两个动态条件,如 R 中的问题?

How to setup two dynamic conditions in SUMIFS like problem in R?

我已经尽力了,但对于 R 来说我仍然是个新手。

基于大约 500mb 的 输入 数据,目前看起来像这样:

TOTALLISTINGS
  listing_id calc.latitude calc.longitude reviews_last30days
1       2818       5829821       335511.0                  1
2      20168       5829746       335265.2                  3
3      25428       5830640       331534.6                  0
4      27886       5832156       332003.1                  3
5      28658       5830888       329727.2                  3
6      28871       5829980       332071.3                  7

我需要计算 reviews_last30days 的条件总和 - 条件是每个记录的特定且不断变化的区域范围,即 R 应该仅对 calc.latitudecalc.longitude 每行的经度和纬度值的偏差不要超过 +/-500。

示例:

所以我预期的 输出 在第 5 列中看起来有点像这样:

TOTALLISTINGS
 listing_id calc.latitude calc.longitude reviews_last30days  reviewsper1000
1       2818       5829821       335511.0                  1             4
2      20168       5829746       335265.2                  3             4
3      25428       5830640       331534.6                  0            10
4      27886       5832156       332003.1                  3             3
5      28658       5830888       331727.2                  3            10
6      28871       5829980       332071.3                  7            10

希望我脑子里计算正确,但你明白了..

直到现在,我的总和条件是动态的,而且 "newly assigned" 因为必须为每条记录调整纬度和经度条件,所以我特别挣扎。

我当前的代码看起来像这样,但它显然不能那样工作:

review1000 <- function(TOTALLISTINGS = NULL){
      # tibble to return
      to_return <- TOTALLISTINGS %>% 
        group_by(listing_id) %>% 
        summarise(
          reviews1000 = sum(reviews_last30days[(calc.latitude>=(calc.latitude-500) | calc.latitude<=(calc.latitude+500))]))
      return(to_return)
    }

REVIEWPERAREA <- review1000(TOTALLISTINGS)

我知道我还必须在上面的代码中为经度添加一些内容

有人知道如何解决这个问题吗? 非常感谢任何帮助或提示并提前致谢! :)

看看下面的代码是否有帮助。

TOTALLISTINGS$reviews1000 <- sapply(1:nrow(TOTALLISTINGS), function(r) {
  currentLATI <- TOTALLISTINGS$calc.latitude[r]
  currentLONG <- TOTALLISTINGS$calc.longitude[r]
  sum(TOTALLISTINGS$reviews_last30days[between(TOTALLISTINGS$calc.latitude,currentLATI - 500, currentLATI + 500) & between(TOTALLISTINGS$calc.longitude,currentLONG - 500, currentLONG + 500)])
})