R “在”期间根据条件删除列表中的元素;“循环”;

R “在”期间根据条件删除列表中的元素;“循环”;,r,lapply,R,Lapply,我正在处理一个非常大的大型数据帧列表(~2GB)。为了节省空间和减小文件大小,我想删除列表中所有NA的一些元素。作为操作的一部分,我需要收集,然后绑定到单个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,

我正在处理一个非常大的大型数据帧列表(~2GB)。为了节省空间和减小文件大小,我想删除列表中所有
NA
的一些元素。作为操作的一部分,我需要收集,然后绑定到单个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

因此,我不能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
t%
子集(!sum(!is.na(值))==0})
%>%绑定行
T
x型值
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

我试图避免创建单独的变量,即尽可能多地使用管道。如果我创建单独的变量,内存就会耗尽。我可以将
subset
语句放在
lappy
语句中并使用管道吗?@LloydChristmas根据您提供的示例,您可以!一般来说,我不明白您为什么不这样做,因为
子集
的输出本身就是一个列表。谢谢。这似乎确实有效。尽管它会导致嵌套的
lappy
语句。我将在更大的数据集上测试这一点,看看它在计算上是否可行。修改后的代码:
lappy(l,函数(x){gather(x,key=“type”,value=“value”,-x)%%>%子集(unlist(lappy(l,函数(x)!all(is.na(x[,-1]))))%%>%bind_行
与您在中提供的修改后的代码不会得到相同的结果。如果我首先使用
collect
得到
t
,然后再将其子集,我会得到正确的结果。你是对的。这段大大简化的代码运行良好。如果你更新答案以反映它,我将接受<代码>lappy(l,函数(x){gather(x,key=“type”,value=“value”,-x)%%>%子集(!sum(!is.na(value))==0)})%%>%bind_行
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