在R中移除所有的最小值和最大值,然后计算平均值

3

我有以下数据集:

wow <- data.frame(a = c(1, 1, 1, 2, 3, 4, 4), b = c(3, 4, 2, 6, 2, 6, 5), c = c(1, 6, 3, 6, 1, 8, 9))
print(wow)
  a b c
1 1 3 1
2 1 4 6
3 1 2 3
4 2 6 6
5 3 2 1
6 4 6 8
7 4 5 9

我需要从每列中移除所有最小值和最大值,然后计算剩余值的平均数,使结果看起来像这样:
print(result)
    a  b    c
1 2.5  4 5.75

我发现一个类似的问题已经有了答案 (在R中计算数据框中行值的均值,排除最小和最大值),但是这个问题的主要区别在于,那个人只处理每列中单个的最小值和最大值,而我可能会有多个最小和最大值。

2个回答

5
我们可以使用%in%从每一列中移除minmax的值,然后通过剩余的值得到mean(平均值)。这可以通过dplyr中的summarise_each实现。
library(dplyr)
summarise_each(wow,funs(mean(.[!.%in% c(min(.), max(.))])))
#    a b    c
#1 2.5 4 5.75

或者使用基本的R。
sapply(wow, function(x) mean(x[!x %in% range(x)]))
#   a    b    c 
#2.50 4.00 5.75 

5
一个 data.table 的解决方案(1.9.5+,但很容易进行回溯),返回一个类似于 data.frame 的对象,看起来你需要这个:
library(data.table)
setDT(wow)[,lapply(.SD,function(x)mean(x[x>min(x)&x<max(x)]))]

或者,按照@akrun的方式。
setDT(wow)[,lapply(.SD,function(x)mean(x[!x%in%range(x)]))]

你的数据需要na.rm=T,如果想要使用.GRP,可能会比前者更复杂。如果想让result是一个向量,可以使用sapply(使用data.frame的解决方案基本相同,而data.table的唯一优点是速度更快)。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接