R - 数据框列中序列中数字的平均值

R - Mean values of numbers in a sequence in a dataframe column

我正在尝试计算在另一列 (x) 中按顺序计数(1、2、3 等)的列 (y) 中的值的平均值。下面显示了一个示例数据框。

> df
   x  y
1  1 15
2  2 20
3  4 16
4  5 12
5  6 17
6  8 14
7  9 13
8 10 19

我想要一个矢量结果,它会读出数字序列中数字的平均值。所需的向量将显示为:17.5 15 15.33333

我不确定产生此预期结果的最佳方法,但我尝试使用 diff(df[,1]) 进行 for 循环以查找断点,但未能成功。

任何人都可以提供任何帮助,我们将不胜感激。这是一个小型示例数据集,但目标是将其应用于大型数据集。

在逻辑向量

上使用cumsumdiff创建分组列
with(df, tapply(y, cumsum(c(TRUE, diff(x) != 1)), FUN = mean))

-输出

  1        2        3 
17.50000 15.00000 15.33333 

数据

df <- structure(list(x = c(1L, 2L, 4L, 5L, 6L, 8L, 9L, 10L), y = c(15L, 
20L, 16L, 12L, 17L, 14L, 13L, 19L)), class = "data.frame",
 row.names = c("1", 
"2", "3", "4", "5", "6", "7", "8"))

更新: 代码减少 2 行:

df %>% 
  group_by(id_Group =cumsum(x-lag(x, default = x[1])>=2)) %>% 
  summarise(mean = mean(y, na.rm=TRUE)) %>% 
  pull(mean)

这是一个 dplyr 版本:

  1. 计算滞后的差值x
  2. 创建群组 cumsum(diff>=2)
  3. 计算均值和pull向量。
library(dplyr)

df %>% 
  mutate(diff= x-lag(x, default = x[1])) %>% 
  group_by(id_Group =cumsum(diff>=2)) %>% 
  mutate(mean = mean(y, na.rm=TRUE)) %>% 
  slice(1) %>% 
  pull(mean)
[1] 17.50000 15.00000 15.33333