在R中,从数据框的行值中排除最小值和最大值的平均值

3
我得到了下面的数据框df(此处显示了片段):
    H2475  H2481  H2669  H2843  H2872  H2873  H2881  H2909
E1 94.470 26.481 15.120 18.490 16.189 11.422 14.886  0.512
E2  1.016  0.363  0.509  1.190  1.855  0.958  0.771  0.815
E3  9.671  0.637  0.571  0.447  0.116  0.452  0.403  0.003
E4  3.448  2.826  2.183  2.607  4.288  2.526  2.820  3.523
E5  2.548  1.916  1.126  1.553  1.089  1.228  0.887  1.065

我想要做的是在去除两个异常值后计算每行的平均值。对于整个行,我使用了plyr:
library(plyr)
df.my_means <- adply(df, 1, transform, my_means = mean(as.matrix(df[i,]) ) )

创建一些临时的数据框/矩阵,将最小值和最大值替换为NAs也可以,但作为初学者我无法做到。

非常感谢您的帮助

编辑1

显然我不知道mean有一个修剪选项。 我想要的解决方案是,我可以插入任何其他函数而不是mean。 也就是说:

library(plyr)
library(e1071)
df.my_means <- adply(df, 1, transform, my_skew = skewness(as.matrix(df[i,]), , 3 ) )

我很抱歉,如果这违反了问题发布规则,但是对于平均值、中位数等分开提问是不直观的。

编辑2没有使用plyr的部分解决方案:

df.my_means <- apply(df ,1, function(x){y=x[order(x)]; (y[2:(length(y)-1)])})

这会断开列值之间的连接。

2
如果您有多个最小/最大值,您是否也想要将它们删除? - themel
如果您想计算行均值,那么您可能应该使用矩阵或转置您的数据框。 - Richie Cotton
@themel:很好的观点。原始数据已经从可能包含多个零的行中进行了过滤,但由于有大约10k行和30列,这种情况可能会发生。我将继续从行中删除一个最小值和一个最大值。 - darked89
1个回答

5
你可以使用 trim 参数来计算平均值:
apply(x,1,mean,trim=1/NCOL(x))
#         E1         E2         E3         E4         E5 
# 17.0980000  0.8765000  0.4376667  2.9583333  1.3295000

我表现不佳:你按照问题陈述回答了,但我预期一个更通用的解决方案,可以插入像 e1071 中没有 trim 的偏态等其他函数。 - darked89
1
@darked89:别担心,如果你把问题编辑得更加通用一些,我会用更通用的解决方案来修改我的答案。 - Joshua Ulrich

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