计算子集均值的更有效方法

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 中,您可以使用 cumsumdiff 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