簡體   English   中英

刪除所有最小值和最大值,然后在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

我發現了一個已經回答過的類似問題( 數據框中的行值,不包括R中的最小值和最大值 ),但最大的區別在於,詢問該問題的人只處理每列中的單個最小值和最大值,雖然我可以在列中有多個最小值和最大值。

我們可以使用%in%刪除每列中minmax的值,並從剩余值中獲取mean 這是可以做到無論是summarise_eachdplyr

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)]))]

或者, @akrun

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

根據您的數據,您可能需要na.rm=T ; 應該有一種方法可以用.GRP來做到這一點,但我認為它最終會比上面更長。

如果你想讓result成為一個向量,請使用sapply (在這種情況下, data.frame解決方案基本相同, data.table的唯一優勢就是速度)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM