对@akrun评论的进一步阐述 -
假设x <- 1:10
。
1) mean
总是返回长度为1的向量。
mean(x)
[1] 5.5
2) ave
总是返回与输入向量相同长度的向量
ave(x)
[1] 5.5 5.5 5.5 5.5 5.5 5.5 5.5 5.5 5.5 5.5
ave
的酷之处在于您还可以将x
分成组,并应用任何函数FUN
以获得输出,再次与x
的长度相同 -
让我们将x
分成两组,每组3个和7个元素,即rep(1:2, each = 5)
(grouping <- rep(1:2, c(3,7)))
[1] 1 1 1 2 2 2 2 2 2 2
ave(x, grouping, FUN = mean)
[1] 2 2 2 7 7 7 7 7 7 7
ave(x, grouping, FUN = sum)
[1] 6 6 6 49 49 49 49 49 49 49
ave(x, grouping, FUN = function(a) sum(a^2))
[1] 14 14 14 371 371 371 371 371 371 371
以上结果与使用 tapply
得到的结果类似,不同之处在于输出的长度与 x 相同。
tapply(x, grouping, mean)
1 2
2 7
tapply(x, grouping, sum)
1 2
6 49
tapply(x, grouping, function(a) sum(a^2))
1 2
14 371
最后,您可以定义自己的函数并将其传递给ave
的FUN
参数,因此您不仅限于计算mean
。
output length = input length
属性使ave
非常有用,可用于向表格数据添加列。例如-Calculate group mean (or other summary stats) and assign to original data
ave
默认按组执行mean
,用于创建新列,因为它返回与输入相同length
的输出,并且顺序保持不变。 - akrunave(1:10, rep(1:2, each = 5))
返回的是前五个数和后五个数的均值,长度总共为10,而mean(1:10)
则返回1到10所有数字的平均值。对于ave(1:5, c(3, 4, 1, 3, 4))
中的顺序,相应组别的均值将以与c(3, 4, 1, 3, 4)
相同的顺序返回。 - akrun