计算R中范围内的数值

计算R中范围内的数值,r,dataframe,range,R,Dataframe,Range,这是玩具的例子。我想比较一下给出范围(如时间)的ra,以及表示事件发生时间的ev 我想在ra中创建一个新的列hits,说明每个范围内发生了多少事件 ra <- data.frame(a=c(0, 250, 500, 750), b=c(250, 500, 750, 900)) ra a b 1 0 250 2 250 500 3 500 750 4 750 900 ev <- data.frame(events=c(1,1,1,1,1), time=c(100, 2

这是玩具的例子。我想比较一下给出范围(如时间)的
ra
,以及表示事件发生时间的
ev

我想在
ra
中创建一个新的列
hits
,说明每个范围内发生了多少事件

ra <- data.frame(a=c(0, 250, 500, 750), b=c(250, 500, 750, 900))
ra
    a   b
1   0 250
2 250 500
3 500 750
4 750 900

ev <- data.frame(events=c(1,1,1,1,1), time=c(100, 200, 450, 550, 600))
ev
  events time
1      1  100
2      1  200
3      1  500
4      1  550
5      1  600
可以做:

library(tidyverse)

crossing(ra, ev) %>%
  group_by(a, b) %>%
  summarise(hits = sum(between(time, a, b)))
输出:

# A tibble: 4 x 3
# Groups:   a [4]
      a     b  hits
  <dbl> <dbl> <int>
1     0   250     2
2   250   500     1
3   500   750     2
4   750   900     0
#一个tible:4 x 3
#分组:a[4]
a b命中率
1     0   250     2
2   250   500     1
3   500   750     2
4   750   900     0

我们可以在
数据表中使用非等联接

library(data.table)
setDT(ev)[ra, .(hits = .N), on = .(time > a, time < b), by = .EACHI]
库(data.table)
setDT(ev)[ra,(点击率=0.N),on=(时间>a,时间
ra$点击a和时间
tidyverse的类似解决方案:

library(tidyverse)
ra$hits <- 
  pmap(ra, ~ ev %>% summarise(sum(events[between(time, .x, .y)]))) %>% 
    unlist
库(tidyverse)
ra$hits%摘要(总和(事件[在(时间,.x,.y)])之间)%>%
非上市
或者,使用与arg0naut和akrun的答案类似的逻辑,但使用普通SQL(与上面的结果相同)

库(sqldf)

ra$hits为什么
coalesce()
?如果没有它,它不是也可以工作吗?如果没有它,0将是一个Na。无论如何,我得到了这个错误:
result\u bind中的错误(res@ptr,params):参数3没有长度4。
来自
sqldf
解决方案。我猜这意味着你给它一个
ra
,有>2列。实际上我意识到这是因为我需要一个
[[1]]
结尾,谢谢您的关注
ra$hits <- mapply(function(a, b) with(ev, sum(events[time > a & time < b])),
                  ra$a,ra$b)

ra
#     a   b hits
# 1   0 250    2
# 2 250 500    1
# 3 500 750    2
# 4 750 900    0
library(tidyverse)
ra$hits <- 
  pmap(ra, ~ ev %>% summarise(sum(events[between(time, .x, .y)]))) %>% 
    unlist
library(sqldf)
ra$hits <- 
  sqldf('
  select    coalesce(sum(events), 0) as hits
  from      ra
            left join ev
              on ev.time > ra.a and ev.time < ra.b
  group by  ra.a
            , ra.b
  ')[[1]]