【问题标题】:R: calculating mean of positive values in every column of a data frameR:计算数据框每一列中正值的平均值
【发布时间】:2017-12-04 17:12:22
【问题描述】:

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

我的代码:

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
}

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

【问题讨论】:

  • sapply(x, function(a) mean(a[a&gt;0]))
  • 天哪,这太快了。但是是否也可以在循环中执行此操作?

标签: r


【解决方案1】:
sapply(x, function (y) mean(y[y > 0]))

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

【讨论】:

  • colMeans(as.matrix(x) * (x &gt; 0)) 除以总行数。
  • 是的,我太快了
【解决方案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,并且之前在您的 mean(...) 中输入了特定的 n_col 选择,您没有选择任何列。

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

数据:

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

【讨论】:

    【解决方案3】:

    如果您想将数据保存在 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
    

    【讨论】:

      猜你喜欢
      • 2020-04-02
      • 1970-01-01
      • 2015-09-10
      • 1970-01-01
      • 2014-03-15
      • 2021-12-12
      • 1970-01-01
      • 2020-05-22
      • 2022-01-11
      相关资源
      最近更新 更多