我有一个非常大的数据帧280,000 x 20,并且许多行(obs)中只有1或0个值。我使用的功能每次操作至少需要2个值。我可以使用for循环迭代,但需要很长时间。我想使用其中一个purrr map函数来提高速度,因为我将多次执行此操作。这就是我用for循环做的事情:
library(Matrix)
M1 <- as.matrix(rsparsematrix(100, 20, .1, rand.x = runif))
x <- vector("integer")
for(i in 1:dim(M1)[1]){
l <- (length(which(M1[i,] == 0)))
x <- c(x,l)
}
ind <- which(x == 19 | x == 20)
M1 <- M1[-ind,]
我还没有找到使用地图的正确方法。我认为它需要使用mutate创建另一个列。
M1 %>% mutate(zero_count = length(map(which(. == 0))))
答案 0 :(得分:1)
目前尚不清楚预期。首先,我们通过添加将matrix
转换为tibble
或data.frame
,然后将mutate
列转换为逻辑列,将reduce
转换为单个vector
+
)每行中的所有TRUE值和cbind
的{{1}}与原始矩阵(&#39; M1&#39;)
vector
根据和
对子行进行子集化library(tidyverse)
M1 %>%
as_tibble %>%
mutate_all(funs(.==0)) %>%
reduce(`+`) %>%
cbind(M1, Count = .)
使用M1 %>%
as_tibble %>%
mutate_all(funs(.==0)) %>%
reduce(`+`) %>%
`%in%`(19:20) %>%
magrittr::extract(M1, .,)
,逻辑base R
上的rowSums
和原始matrix
的{{1}}
cbind
或使用matrix
cbind(M1, Count = rowSums(!M1))
答案 1 :(得分:1)
您可以使用apply
apply(M1, 1 , function(x) sum(!x))