计算变量中间隔的平均值

时间:2019-12-10 07:28:32

标签: r mean

假设我有一个像这样的数据集: dat <- rnorm(25) 还有一个向量,代表我的数据的特定索引:v <- c(1, 8, 13, 17, 25)

如何计算以下间隔的平均值:1-1、1-8、8-13、13-17、17-25?

通常:我想根据有意义的索引向量datv中的特定区间进行平均,但也很不规则。

4 个答案:

答案 0 :(得分:4)

我们可以使用findInterval组成组,并使用tapply获得每个组的mean

tapply(dat, findInterval(seq_along(dat), v, left.open = TRUE), mean)

#         0          1          2          3          4 
#-0.5604756  0.3484638  0.1704305  0.4599013 -0.6754733 

数据

set.seed(123)
dat <- rnorm(25)
v <- c(1, 8, 13, 17, 25)

答案 1 :(得分:4)

您可以使用cut获取间隔组,并使用aggregate计算每个组的mean

aggregate(dat, list(interval=cut(seq(dat), c(0,v))), mean)
#  interval          x
#1    (0,1] -0.5604756
#2    (1,8]  0.3484638
#3   (8,13]  0.1704305
#4  (13,17]  0.4599013
#5  (17,25] -0.6754733

或者如果您希望间隔在第一个位置和最后一个位置重叠,则可以使用sapply

sapply(seq(v), function(i) mean(dat[v[max(1,i-1)]:v[i]]))
#[1] -0.56047565  0.23484641 -0.06881816  0.44807533 -0.54510397

答案 2 :(得分:1)

使用dplyr

library(dplyr)
tibble(x = dat) %>% 
    group_by(Interval = findInterval(row_number(), v, left.open = TRUE)) %>% 
    summarise(x = mean(x))

答案 3 :(得分:0)

您可以使用split()cut()创建组,然后通过sapply计算每个组的均值,即

r <- sapply(split(dat,cut(seq_along(dat), c(-Inf,v))),mean)

示例

set.seed(1)
dat <- rnorm(25)
v <- c(1, 8, 13, 17, 25)
r <- sapply(split(dat,cut(seq_along(dat), c(-Inf,v))),mean)

给予

> r
  (-Inf,1]      (1,8]     (8,13]    (13,17]    (17,25] 
-0.6264538  0.2397270  0.3101554 -0.2877232  0.3456389