我有一个应该像tapply()一样工作的函数,但似乎无法正常工作。我需要使用for循环。
baby.tapply = function(X, INDEX, FUN) {
z = 0
for(y in levels(factor(INDEX))){
z = FUN(X)
}
return(z)
}
baby.tapply(X=mtcars$mpg, INDEX=mtcars$cyl, FUN=mean)
#Should mimic this:
tapply(mtcars$mpg, mtcars$cyl, mean)
从这里出发有什么建议吗?我的输出:20.090625 1
正确的输出(来自抽头)4 6 8 26.66364 19.74286 15.10000
这里有一种方法来模拟tapply
与for
循环:
baby.tapply = function(X, INDEX, FUN) {
lvls <- levels(factor(INDEX))
z <- numeric(length(lvls))
for(y in seq_along(lvls)){
z[y] = FUN(X[INDEX == lvls[y]])
}
return(setNames(z, lvls))
}
baby.tapply(X=mtcars$mpg, INDEX=mtcars$cyl, FUN=mean)
# 4 6 8
#26.66364 19.74286 15.10000
#Comparing with the output of tapply
tapply(mtcars$mpg, mtcars$cyl, mean)
# 4 6 8
#26.66364 19.74286 15.10000
如@Onyambu所提到的,可能最好将其初始化z
为列表而不是向量
z <- vector("list",length(lvls))
对于诸如range
返回两个值的函数。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句