首页 > 解决方案 > 如何修剪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 "}"

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

标签: rdesctools

解决方案


目前尚不清楚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

推荐阅读