Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/67.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
删除所有最小值和最大值,然后在R中找到平均值_R_Vector_Dataframe_Plyr - Fatal编程技术网

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

删除所有最小值和最大值,然后在R中找到平均值,r,vector,dataframe,plyr,R,Vector,Dataframe,Plyr,我有以下数据集: 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 我发现一个类似的问题已经得到了回答(),但最大的区别是,提出这个问题的人只处理每列中的一个最小值和最大值,虽然我可以在一

我有以下数据集:

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

我发现一个类似的问题已经得到了回答(),但最大的区别是,提出这个问题的人只处理每列中的一个最小值和最大值,虽然我可以在一列中有多个最小值和最大值。

我们可以使用
%in%
删除每列中
min
max
的值,并从剩余值中获取
平均值。这可以通过从
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+
,但可以很容易地进行反向调整),用于返回一个类似
data.frame
的对象,这似乎是您想要的:

library(data.table)
setDT(wow)[,lapply(.SD,function(x)mean(x[x>min(x)&x<max(x)]))]
根据您的数据,您可能需要
na.rm=T
;还有一种方法可以通过
.GRP
实现这一点,但我认为它最终会比上面提到的更长

如果希望
result
成为向量,请使用
sapply
(在这种情况下,
data.frame
解决方案基本相同,
data.table
的唯一优点是速度)

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