bsh*_*141 3 r vector plyr dataframe
我有以下数据集:
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
Run Code Online (Sandbox Code Playgroud)
我需要从每列中删除所有最小值和最大值,然后计算剩余值的平均值,以便结果如下所示:
print(result)
a b c
1 2.5 4 5.75
Run Code Online (Sandbox Code Playgroud)
我发现了一个已经回答的类似问题(平均值来自数据框中的行值,不包括 R 中的最小值和最大值),但最大的区别是提出该问题的人仅处理每列中的单个最小值和最大值,而我可以在一列中有多个最小值和最大值。
我们可以使用 删除每列中的min
和 的值,并从剩余的值中获取。这可以通过from来完成max
%in%
mean
summarise_each
dplyr
library(dplyr)
summarise_each(wow,funs(mean(.[!.%in% c(min(.), max(.))])))
# a b c
#1 2.5 4 5.75
Run Code Online (Sandbox Code Playgroud)
或者使用base R
sapply(wow, function(x) mean(x[!x %in% range(x)]))
# a b c
#2.50 4.00 5.75
Run Code Online (Sandbox Code Playgroud)
一个data.table
解决方案(1.9.5+
,但可以很容易地重新安装)返回一个data.frame
类似的对象,这似乎是您想要的:
library(data.table)
setDT(wow)[,lapply(.SD,function(x)mean(x[x>min(x)&x<max(x)]))]
Run Code Online (Sandbox Code Playgroud)
或者,@ akrun
setDT(wow)[,lapply(.SD,function(x)mean(x[!x%in%range(x)]))]
Run Code Online (Sandbox Code Playgroud)
您可能需要na.rm=T
根据您的数据;还应该有一种方法可以做到这一点,.GRP
但我认为它最终会比上面的更长。
如果你想result
成为向量,请使用sapply
(这种情况下data.frame
解决方案基本相同,唯一的优点data.table
是速度)。
归档时间: |
|
查看次数: |
2776 次 |
最近记录: |