通过基础 R 中的运行来识别和分组

人们可能希望通过运行变量对数据进行分组并执行某种分析。请考虑以下简单数据集:

(dat <- data.frame(x = c(1, 1, 2, 2, 2, 1), y = 1:6))
#   x y
# 1 1 1
# 2 1 2
# 3 2 3
# 4 2 4
# 5 2 5
# 6 1 6

变量 x 有三个运行:长度为 2 且值为 1 的运行,长度为 3 且值为 2 的运行,以及长度为 1 且值为 1 的运行。我们可能希望计算每个变量 y 的平均值。变量 x 的运行(这些平均值分别为 1.5,4 和 6)。

在基数 R 中,我们首先使用 rle 计算 x 变量的行程编码:

(r <- rle(dat$x))
# Run Length Encoding
#   lengths: int [1:3] 2 3 1
#   values : num [1:3] 1 2 1

下一步是计算数据集每行的运行编号。我们知道运行总数是 length(r$lengths),每次运行的长度是 r$lengths,所以我们可以用 rep 计算每次运行的运行次数:

(run.id <- rep(seq_along(r$lengths), r$lengths))
# [1] 1 1 2 2 2 3

现在我们可以使用 tapply 通过对运行 id 进行分组来计算每次运行的平均 y 值:

data.frame(x=r$values, meanY=tapply(dat$y, run.id, mean))
#   x meanY
# 1 1   1.5
# 2 2   4.0
# 3 1   6.0