gpt4 book ai didi

r - 获取列表示非零数据

转载 作者:行者123 更新时间:2023-12-04 13:22:41 26 4
gpt4 key购买 nike

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

先谢谢了

解决方案基准:
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更改为NA,然后使用colMeans,因为它具有na.rm=TRUE的选项。在两步过程中,我们将“0”的数据元素转换为“NA”,然后获得除colMeans元素之外的NA

  is.na(data) <- data==0
colMeans(data, na.rm=TRUE)
# col1 col2
# 2 6

如果只需一步,我们可以对(0)和非零元素对应的值进行( data==0),然后将逻辑矩阵( NA)更改为 NA^和1,然后与原始数据相乘,从而更改1个值到那个位置上的元素,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内部的函数。
 library(dplyr)
summarise_each(data, funs(mean(.[.!=0])))
# col1 col2
#1 2 6

关于r - 获取列表示非零数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31790936/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com