在 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
我正在使用 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