删除所有最小值和最大值,然后在 R 中找到平均值

Removing ALL min and max values and then finding the mean in R

我有以下数据集:

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

我发现了一个已经回答过的类似问题 (mean from row values in a dataframe excluding min and max values in R),但最大的不同是提出该问题的人只处理每列中的单个最小值和最大值,而我可以一列中有多个最小值和最大值。

我们可以使用 %in% 删除每列中 minmax 的值,并从剩余值中获取 mean。这可以通过 summarise_each from dplyr

来完成
library(dplyr)
summarise_each(wow,funs(mean(.[!.%in% c(min(.), max(.))])))
#    a b    c
#1 2.5 4 5.75

或使用base R

sapply(wow, function(x) mean(x[!x %in% range(x)]))
#   a    b    c 
#2.50 4.00 5.75 

一个 data.table 解决方案(1.9.5+,但可以很容易地重新安装)到 return 一个 data.frame 类对象,这似乎是你想要的:

library(data.table)
setDT(wow)[,lapply(.SD,function(x)mean(x[x>min(x)&x<max(x)]))]

或者,a la @akrun

setDT(wow)[,lapply(.SD,function(x)mean(x[!x%in%range(x)]))]

根据您的数据,您可能需要 na.rm=T.GRP 也应该有一种方法可以做到这一点,但我认为它最终会比上面的更长。

如果你想让result成为一个向量,使用sapply(在这种情况下data.frame解决方案基本相同,data.table的唯一优势是速度)。