在 R 中使用 tapply 不正确 returns

Incorrect returns using tapply in R

我正在使用 R 中的 tapply 函数。我只是想让 tapply 函数达到 return 与 sapply 函数相同的结果(我非常确定它是正确的)。

目标:

我正在处理 state.x77 数据,并尝试使用 sapply 和 tapply 函数找出每个地区的识字率。

代码:

####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))
})

我发现我正在为 tapply 使用不同的数据框。我想我应该使用 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 减去意味着你只取 [=15] 的值=] 而不是完整的数据框。此外,您不需要 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 内。这带来了不同形式的答案,但仍然应该得到你想要的。

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