通过基础 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