我想计算日期框架每列的平均值。但只应考虑正值。每列的正平均值总结在一个向量中。
我的代码:
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
}
此代码不起作用。也许有人有更好的主意。
答案 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