有条件地应用值超过特定值的函数

Conditionally apply a function with values over a certain value

我确定有一个简单的解决方案,但我似乎无法输出正确的值。我有一个数据框,我想根据高于某个值的值计算平均值,在本例中为 150。

df1 <- as.data.frame(matrix(sample(0:1000, 36*10, replace=TRUE), ncol=1))
df2 <- as.data.frame(matrix(sample(0:500, 36*10, replace=TRUE), ncol=1))
df3 <- as.data.frame(matrix(sample(0:200, 36*10, replace=TRUE), ncol=1))
Example <- cbind(df1,df2,df3)

我做过的类似事情让我认为应用可能是最有效的方法(并且我尝试按照下面 link 中的步骤操作)。 http://rforpublichealth.blogspot.co.uk/2012/09/the-infamous-apply-function.html。但是,以下代码的输出是错误的,尽管我试图表示平均值高于 150,但输出低于 1。

test<- apply(Example,2,function(x) {mean(x > 150)})

非常感谢任何帮助,谢谢!

你很接近,但需要做 mean(x[x > 150]) 而不是 mean(x > 150):

test<- apply(Example,2,function(x) {mean(x[x > 150])})

这是有效的,因为 x[x > 150] 说 "take all values of x where x is above 150"。

所有值的平均值。

mean(as.matrix(Example)[as.matrix(Example) > 150])
[1] 426.0402

按列

sapply(Example, function(x) mean(x[x > 150]))
      V1       V1       V1 
575.6926 332.9713 175.6809 

一个更快的选择是在按列计算平均值之前使用 matrix subsetting 到 select 正确的值:

ids <- which(Example>150,arr.ind=T)  ## first all right values are selected 
sapply(seq_len(ncol(Example)),       ## compute mean for each column
        function(x)mean(Example[ids[ids[,2]==x,]]))