我有一个函数,它应该像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
正确输出(来自tapply) 4 6 8 26.66364 19.74286 15.10000
发布于 2020-03-02 01:49:44
下面是用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初始化为list而不是向量
z <- vector("list",length(lvls))对于返回两个值的函数(如range )。
https://stackoverflow.com/questions/60481527
复制相似问题