计算R

时间:2019-02-21 19:36:16

标签: r dataframe range

这是玩具示例。我想比较raev,后者给出范围(例如时间),而hits则表明事件发生的时间。

我想在ra中新建一列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 ,说明每个范围内发生了多少事件。

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

这就是结果的样子。

sudo certbot certonly --webroot -w /var/www/html  -d startuplab.io

3 个答案:

答案 0 :(得分:4)

可以做到:

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

答案 1 :(得分:4)

我们可以在data.table中使用非等号联接

library(data.table)
setDT(ev)[ra, .(hits = .N), on = .(time > a, time < b), by = .EACHI]

答案 2 :(得分:2)

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

tidyverse的类似解决方案:

library(tidyverse)
ra$hits <- 
  pmap(ra, ~ ev %>% summarise(sum(events[between(time, .x, .y)]))) %>% 
    unlist

或者,使用与arg0naut和akrun的答案类似的逻辑,但使用简单的SQL(与上述结果相同)

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]]
相关问题