R可以获取数据框的非零值的colMeans吗?
data<-data.frame(col1=c(1,0,1,0,3,3),col2=c(5,0,5,0,7,7))
colMeans(data) # 1.33,4
我想要像:
mean(data$col1[data$col1>0]) # 2
mean(data$col2[data$col2>0]) # 6
提前致谢:D
<小时/> 解决方案的基准:
n <- 2E4
m <- 1E3
data <- matrix(runif(n*m),nrow = n)
system.time (col_means <- colSums(data)/colSums(!!data) )
# user system elapsed
# 0.087 0.007 0.094
system.time ( colMeans(NA^(data==0)*data, na.rm=TRUE))
# user system elapsed
# 0.167 0.084 0.251
system.time (vapply(data, function(x) mean(x[x!=0]), numeric(1)))
# user system elapsed
#126.519 0.737 127.715
library(dplyr)
system.time (summarise_each(data, funs(mean(.[.!=0])))) # Gave error
答案 0 :(得分:9)
您可以对数据使用colSums
,并使用“逻辑表示”将列总和除以每列的非零元素数量:
colSums(data)/colSums(!!data)
col1 col2
2 6
答案 1 :(得分:5)
您可以将/* 0 */
{
"_id" : ObjectId("55bf84307b4720b3bcd0b9ab"),
"memberId" : "XY-123",
"transactions" : [
{
"date" : ISODate("2015-07-16T00:00:00.000Z"),
"transactionsDetails" : [
{
"memberId" : "1011",
"orderId" : "235",
"topLevelcategory" : "Furniture",
"orderValue" : "2534.200"
},
{
"memberId" : "1012",
"orderId" : "235",
"topLevelcategory" : "Grocery",
"orderValue" : "2534.200"
},
{
"memberId" : "1013",
"orderId" : "235",
"topLevelcategory" : "Grocery",
"orderValue" : "2534.200"
},
{
"memberId" : "1014",
"orderId" : "235",
"topLevelcategory" : "Grocery",
"orderValue" : "2534.200"
}
]
}
]
}
更改为0
,然后使用NA
,因为它有colMeans
的选项。在两个步骤中,我们将数据元素“0”转换为“NA”,然后获取na.rm=TRUE
除colMeans
个元素。
NA
如果您只需一步即可,我们可以将逻辑矩阵( is.na(data) <- data==0
colMeans(data, na.rm=TRUE)
# col1 col2
# 2 6
)更改为data==0
,并通过执行(NA
)将值更改为“0”和非零元素然后与原始数据相乘,以便1个值更改为该位置的元素,NA保持原样。我们可以对上面的输出执行NA^
。
colMeans
另一种选择是使用 colMeans(NA^(data==0)*data, na.rm=TRUE)
# col1 col2
# 2 6
。如果数据集非常大,转换为sapply/vapply
可能不是一个好主意,因为它可能会导致内存问题。通过使用matrix
或更具体的sapply
(更快一点)循环遍历列,我们得到非零元素的vapply
。
mean
或者我们可以使用 vapply(data, function(x) mean(x[x!=0]), numeric(1))
# col1 col2
# 2 6
并在对非零元素进行子集化后在summarise_each
内指定函数。
funs