使用purrr :: map函数计算大data.frame每行中的零个数

时间:2018-04-13 12:21:30

标签: r purrr map-function

我有一个非常大的数据帧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))))

2 个答案:

答案 0 :(得分:1)

目前尚不清楚预期。首先,我们通过添加将matrix转换为tibbledata.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))