计算子集均值的更有效方法
More efficient way to compute mean for subset
在此数据框中:
df <- data.frame(
comp = c("pre",rep("story",4), rep("x",2), rep("story",3)),
hbr = c(101:110)
)
假设我需要计算 hbr
子集到第一个区域 comp=="story"
的均值,我如何才能比这种方式更有效地做到这一点,这看起来笨重且冗长并且需要我指定 grp
我想手动计算 的平均值:
library(dplyr)
library(data.table)
df %>%
mutate(grp = rleid(comp)) %>%
summarise(M = mean(hbr[grp==2]))
M
1 103.5
我不确定这是否更好,但至少你只需要指定你想要 'story' 的第一个 运行:
df %>%
mutate(grp = ifelse(comp == 'story', rleid(comp), NA)) %>%
filter(grp == min(grp, na.rm = TRUE)) %>%
summarise(M = mean(hbr))
#> M
#> 1 103.5
在 base R 中,您可以使用 cumsum
和 diff
select 所需的行,然后选择您需要的组(这里是第一个,所以是 1),然后然后计算这些行的平均值。使用此选项,您无需手动获取所需的组,也不需要任何其他包。
idx <- which(df$comp == "story")
first <- idx[cumsum(c(1, diff(idx) != 1)) == 1]
#[1] 2 3 4 5
mean(df$hbr[first])
#[1] 103.5
在此数据框中:
df <- data.frame(
comp = c("pre",rep("story",4), rep("x",2), rep("story",3)),
hbr = c(101:110)
)
假设我需要计算 hbr
子集到第一个区域 comp=="story"
的均值,我如何才能比这种方式更有效地做到这一点,这看起来笨重且冗长并且需要我指定 grp
我想手动计算 的平均值:
library(dplyr)
library(data.table)
df %>%
mutate(grp = rleid(comp)) %>%
summarise(M = mean(hbr[grp==2]))
M
1 103.5
我不确定这是否更好,但至少你只需要指定你想要 'story' 的第一个 运行:
df %>%
mutate(grp = ifelse(comp == 'story', rleid(comp), NA)) %>%
filter(grp == min(grp, na.rm = TRUE)) %>%
summarise(M = mean(hbr))
#> M
#> 1 103.5
在 base R 中,您可以使用 cumsum
和 diff
select 所需的行,然后选择您需要的组(这里是第一个,所以是 1),然后然后计算这些行的平均值。使用此选项,您无需手动获取所需的组,也不需要任何其他包。
idx <- which(df$comp == "story")
first <- idx[cumsum(c(1, diff(idx) != 1)) == 1]
#[1] 2 3 4 5
mean(df$hbr[first])
#[1] 103.5