R:计算数据帧的每列中的正值的平均值

时间:2017-06-30 16:59:35

标签: r

我想计算日期框架每列的平均值。但只应考虑正值。每列的正平均值总结在一个向量中。

我的代码:

x <- data.frame(replicate(3, sample(-5000:7000, 1000, rep = TRUE)))

meanxpositive <- c(NA)

for (n_col in 1:3) {     
    z <- mean(x[which(x[, ncol] > 0)])
    meanxpositive[n_col] <- z
}

此代码不起作用。也许有人有更好的主意。

3 个答案:

答案 0 :(得分:2)

sapply(x, function (y) mean(y[y > 0]))

colMeans(as.matrix(x) * (x > 0))

答案 1 :(得分:2)

colMeans方法可能如下:

x[x<=0] <- NA
colMeans(x, na.rm=T)

#      X1       X2       X3 
#3483.664 3626.115 3533.687 

由于您还提到要使用for loop查看此解决方案,因此您可以将旧代码调整为:

meanxpositive<-rep(NA, ncol(x))

for (n_col in 1:3) {
  z<-mean(x[which(x[,n_col]>0), n_col]) #Changed this line to reference "n_col" instead of "ncol"
  meanxpositive[n_col]<-z
}
meanxpositive
#[1] 3483.664 3626.115 3533.687

注意我将对ncol的引用更改为n_col,并在n_col之前添加了mean(...)的特定选择,之前您没有选择任何列。< / p>

最后,对于for loops,最好“预先分配”结果的内存。在这种情况下,这意味着将其设置为您应知道的大小(3)。在R中,循环中的对象非常缓慢且效率低下。

数据:

set.seed(1)
x<-data.frame(replicate(3,sample(-5000:7000,1000,rep=TRUE)))

答案 2 :(得分:2)

如果您想将数据保存在data.frame中,

library(dplyr)
set.seed(47)

x <- data.frame(replicate(3, sample(-5000:7000, 1000, replace = TRUE)))

x %>% summarise_all(~mean(.x[.x > 0]))
#>         X1       X2       X3
#> 1 3578.912 3535.614 3358.444

或使用旧的funs表示法

x %>% summarise_all(funs(mean(.[. > 0])))
#>         X1       X2       X3
#> 1 3578.912 3535.614 3358.444

或在基地R,

aggregate(. ~ TRUE, x, function(x){mean(x[x > 0])})
#>         X1       X2       X3
#> 1 3578.912 3535.614 3358.444

或data.table,

library(data.table)

setDT(x)[, lapply(.SD, function(x){mean(x[x > 0])})]
#>          X1       X2       X3
#> 1: 3578.912 3535.614 3358.444