我正在处理一个非常大的大数据帧列表(~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
这样做的结果包括NA
值y
的所有{。}}。
我想完全从列表中删除元素。如果删除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
答案 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