0

我正在尝试按百分比修剪 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 "}"

如果您对我如何获得相同的结果有其他建议,我会全力以赴。

4

2 回答 2

1

目前尚不清楚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
于 2020-11-17T16:24:23.140 回答
0

我想你想做的是

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

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

 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?一般来说,为您的问题使用最简单的数据结构,这里是一个数字向量。

于 2020-11-18T07:56:19.787 回答