使用taply [r]返回不正确的结果

问题描述 投票:0回答:2

INFO:大家晚上好。如标题所示,我正在使用tapply函数。我只是想让tapply函数返回与sapply函数相同的结果(我很确定那是正确的)。

语言:R

目标:我正在使用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))
})

任何帮助。

r sapply tapply
2个回答
1
投票

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 

0
投票

只需添加另一种想法,因为您说过您认为您应该使用“ 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
© www.soinside.com 2019 - 2024. All rights reserved.