我正在使用R中的tapply函数。我只是试图让tapply函数返回与sapply函数相同的结果(我确定是正确的)。
目标:
我正在使用state.x77数据,并尝试使用sapply和tapply函数查找每个区域的识字率。
CODE:
####Setting up the data
state.df = data.frame(state.x77, Region=state.region, Division=state.division)
state.by.region = split(state.df, f=state.region)
state.by.div = split(state.df, f=state.division)
####Tapply
tapply(state.df$Illiteracy, INDEX = state.region,FUN = function(v){
li.rate = 100 - state.df$Illiteracy
return(median(li.rate))
})
我看到我正在使用不同的数据帧进行轻敲。我认为我应该使用state.by.region,但是我根本无法使用它。我能想到的最好的是:
tapply(state.by.region[,"Illiteracy"], INDEX = state.region, FUN = function(v){
li.rate = 100 - state.by.region$Illiteracy
return(median(li.rate))
})
接下来我可以尝试什么?
在tapply
的匿名函数中,您应该将v
减去100,而不是state.df$Illiteracy
,因为将v
减去意味着您只为该Region
取值,而不是完整的数据帧。同样,您不需要split
数据,您可以将列名称称为INDEX
。
tapply(state.df$Illiteracy, INDEX = state.df$Region,FUN = function(v){
li.rate = 100 - v
return(median(li.rate))
})
# Northeast South North Central West
# 98.90 98.25 99.30 99.40
只需添加另一种想法,因为您说过您认为您应该使用“ state.by.region”。文档说,tapply像对象一样接受矢量,您可以将“ state.by.region”放置在tapply的外部和内部。这带来了不同形式的答案,但仍然应该得到您想要的。
sapply(state.by.region,
function(v) tapply(v$Illiteracy, INDEX = v$Region, function(y) median(100-y)))
# Northeast South North Central West
# Northeast 98.9 NA NA NA
# South NA 98.25 NA NA
# North Central NA NA 99.3 NA
# West NA NA NA 99.4