在“循环”

时间:2017-05-22 19:41:43

标签: r lapply

我正在处理一个非常大的大数据帧列表(~2GB)。为了节省空间并减小文件大小,我想删除列表中所有NA的一些元素。作为操作的一部分,我需要gather然后绑定到单个data.frame。

以下是一个例子:

library(tidyr)
library(dplyr)

a <- data.frame(x=rep(1,3), y1=1:3, y2=1:3)
b <- data.frame(x=rep(2,3), y1=NA,  y2=NA)
c <- data.frame(x=rep(3,3), y1=1:3, y2=NA)

l <- list(a,b,c)

t <- lapply(l, function(x){
  gather(x, key="type", value="value", -x) # %>%
    #remove list element here %>%
    #do other operations like mutate here
}) %>%
  bind_rows

这样做的结果包括NAy的所有{。}}。

我想完全从列表中删除元素。如果删除NA的所有行,它仍会留下一个空的列表元素,然后使用mutate或其他操作崩溃进一步的计算。

我正在尝试通过第一次调用lapply来处理此操作,因为我发现在此之后进行过滤需要大量内存(通常在最大化此计算机上的16GB后崩溃) 。在标题中,当我说“list”时,我指的是这个apply声明。

在此示例中,结果应如下所示:

> t[-(7:12),]
   x type value
1  1   y1     1
2  1   y1     2
3  1   y1     3
4  1   y2     1
5  1   y2     2
6  1   y2     3
13 3   y1     1
14 3   y1     2
15 3   y1     3
16 3   y2    NA
17 3   y2    NA
18 3   y2    NA

1 个答案:

答案 0 :(得分:1)

所以,我并不是100%肯定我理解这个问题,但假设我做了,可能的答案是:

t <- lapply(l, function(x){ 
           gather(x, key="type", value="value", -x) %>%    
                  subset(!sum(!is.na(value)) == 0) }) 
        %>% bind_rows
t
   x type value
1  1   y1     1
2  1   y1     2
3  1   y1     3
4  1   y2     1
5  1   y2     2
6  1   y2     3
7  3   y1     1
8  3   y1     2
9  3   y1     3
10 3   y2    NA
11 3   y2    NA
12 3   y2    NA