获取列意味着非零数据

时间:2015-08-03 15:16:33

标签: r

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

2 个答案:

答案 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=TRUEcolMeans个元素。

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