计算变量内间隔的平均值
Calculating the mean for intervalls within a variable
假设我有一个像这样的数据集:
dat <- rnorm(25)
和一个向量,表示我的数据的特定索引:v <- c(1, 8, 13, 17, 25)
如何计算以下区间的平均值:1-1、1-8、8-13、13-17、17-25?
总的来说:我想根据索引向量 v
对 dat
内的特定区间进行平均,这很有意义,但也很不规则。
我们可以用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)
您可以使用 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
您可以使用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
使用dplyr
library(dplyr)
tibble(x = dat) %>%
group_by(Interval = findInterval(row_number(), v, left.open = TRUE)) %>%
summarise(x = mean(x))
假设我有一个像这样的数据集:
dat <- rnorm(25)
和一个向量,表示我的数据的特定索引:v <- c(1, 8, 13, 17, 25)
如何计算以下区间的平均值:1-1、1-8、8-13、13-17、17-25?
总的来说:我想根据索引向量 v
对 dat
内的特定区间进行平均,这很有意义,但也很不规则。
我们可以用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)
您可以使用 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
您可以使用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
使用dplyr
library(dplyr)
tibble(x = dat) %>%
group_by(Interval = findInterval(row_number(), v, left.open = TRUE)) %>%
summarise(x = mean(x))