我正在尝试按百分比修剪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?通常,使用最简单的数据结构来解决问题,这里是一个数字向量。