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

时间:2015-06-08 09:52:08

标签: r apply

我确定有一个简单的解决方案,但我似乎无法输出正确的值。我有一个数据框,我想根据某个值以上的值计算平均值,在本例中为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)

我所做的类似的事情让我觉得申请可能是最有效的方式(我试图按照下面的链接中的步骤)。 http://rforpublichealth.blogspot.co.uk/2012/09/the-infamous-apply-function.html。但是,以下代码的输出是错误的,尽管我试图将平均值高于150,但输出仍然低于1.

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

任何帮助都将受到高度赞赏谢谢!

3 个答案:

答案 0 :(得分:1)

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

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

这是有效的,因为x[x > 150]说“取x的所有值,其中x大于150”。

答案 1 :(得分:0)

所有值的平均值。

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 

答案 2 :(得分:0)

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

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