如何修剪r中的向量



我正在尝试按百分比修剪r中的向量。函数应丢弃X的最低5%和最高5%值,然后返回X的平均值、方差和中值。

my_aggregation <- function(x,is.truncated=FALSE){
if (is.truncated==FALSE) return(data.frame(mean = mean(x), med = median(x), var = var(x)))  
if (is.truncated==TRUE) Trim(x,0.05) return(data.frame(mean = mean(x), med = median(x), var = var(x)))  

}

我试着给一个新的变量赋值,比如这个

if (is.truncated==TRUE) x2 <- Trim(x,0.05) return(data.frame(mean = mean(x2), med = median(x2), var = var(x2)))  

运气不好。我没有发现问题的原因是因为我是新来的,而且当我运行这个时

my_aggregation <- function(x,is.truncated=FALSE){  
if (is.truncated==FALSE) return(data.frame(mean = mean(x), med = median(x), var = var(x)))  
if (is.truncated==TRUE)return(data.frame(mean = mean(x), med = median(x), var = var(x)))  
if (is.truncated=="BOTH") return({x*2})
}

一切都很好。也许这与Trim((函数有关,但我不知道到底是什么。不管怎样,这就是我犯的错误。

Error: unexpected symbol in:
"  if (is.truncated==FALSE) return(data.frame(mean = mean(x), med = median(x), var = var(x)))  
if (is.truncated==TRUE) Trim(x,0.05) return"
>   if (is.truncated=="BOTH") return({x*2})
Error: object 'is.truncated' not found
> }
Error: unexpected '}' in "}"

如果你对我如何取得同样的结果有其他建议,我会洗耳恭听。

问题中的Trim是什么还不清楚,is.truncated的意义也不清楚。我的最佳猜测是,您希望获得汇总统计数据,但可以控制用户是否可以修剪掉底部5%、顶部5%,或者两者兼而有之。如果是这样,你可以做:

my_aggregation <- function(x, truncate = c("none", "lower", "upper", "both")) 
{
truncate <- match.arg(truncate, truncate)
keep <- !logical(length(x))
if(truncate == "lower" | truncate == "both") 
keep[x < quantile(x, 0.05)] <- FALSE
if(truncate == "upper" | truncate == "both")
keep[x > quantile(x, 0.95)] <- FALSE
x <- x[keep]
return(data.frame(min = min(x), max = max(x), mean = mean(x), 
med = median(x), var = var(x)))
}

这允许你做:

my_aggregation(1:100, "none")
#>   min max mean  med      var
#> 1   1 100 50.5 50.5 841.6667
my_aggregation(1:100, "lower")
#>   min max mean med var
#> 1   6 100   53  53 760
my_aggregation(1:100, "upper")
#>   min max mean med var
#> 1   1  95   48  48 760
my_aggregation(1:100, "both")
#>   min max mean  med   var
#> 1   6  95 50.5 50.5 682.5

我想你想做的是

my_aggregation <- function(x, is.truncated=FALSE){

require(DescTools)      
if (is.truncated)   # a '== TRUE' chunk would be obsolete
x <- Trim(x, trim = 0.05)

return(c(mean=mean(x), median=median(x), var=var(x)))
}         
set.seed(34)
x <- runif(100)
my_aggregation(x)
#       mean     median        var 
# 0.51284962 0.50315252 0.08925482 
my_aggregation(x, is.truncated = TRUE)
#       mean     median        var 
# 0.51390241 0.50315252 0.07350477 

请注意,如果您的代码类似,则不会存储修剪语句的结果

if (is.truncated==TRUE) Trim(x,0.05) return(data.frame(mean = mean(x), med = median(x), var = var(x)))  

使用缩进将揭示代码的逻辑,即

if (is.truncated==TRUE) 
Trim(x,0.05)
return(data.frame(mean = mean(x), med = median(x), var = var(x)))  

所以您可以看到,在is.truncated的条件下,只有Trim(x,0.05)被执行。使用{}组合多个步骤,例如

if (is.truncated==TRUE) {
x <- Trim(x,0.05)   # you have to redefine x here, if it should be used afterwards
return(data.frame(mean = mean(x), med = median(x), var = var(x)))
}  

最后一个问题:如果结果只有三个数值,为什么要返回data.frame?通常,使用最简单的数据结构来解决问题,这里是一个数字向量。

相关内容

  • 没有找到相关文章

最新更新