【问题标题】:Remove elements of list based on condition during "loop"在“循环”期间根据条件删除列表元素
【发布时间】:2017-05-24 04:40:31
【问题描述】:

我正在处理一个非常大的大型数据帧列表 (~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

这样的结果包括一些 data.frames 都是 NA 对于我的值 y

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

我正在尝试通过第一次调用 lapply 来处理此操作,因为我发现在那之后进行过滤需要大量内存(在我在这台计算机上使用 16GB 后经常崩溃)。在标题中,当我说“列表”时,我指的是 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

【问题讨论】:

    标签: r lapply


    【解决方案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
    

    【讨论】:

    • 我试图避免创建单独的变量,即尽可能多地使用管道。如果我创建单独的变量,我会用完内存。我可以将subset 语句带入lapply 语句并使用管道吗?
    • @LloydChristmas 用你提供的例子,你可以!一般来说,我不明白你为什么不这样做,因为subset 的输出本身就是一个列表。
    • 谢谢。这似乎确实有效。尽管它会导致嵌套的 lapply 语句。我将在我更大的数据集上对此进行测试,看看它在计算上是否可行。修改代码:lapply(l, function(x){ gather(x, key="type", value="value", -x) %&gt;% subset(unlist(lapply(l, function(x) !all(is.na(x[,-1])))))}) %&gt;% bind_rows
    • 您提供的修改后的代码不会得到相同的结果。如果我首先使用gather 得到t 然后对其进行子集化,我会得到正确的结果。
    • 你是对的。这个大大简化的代码运行良好。如果您更新答案以反映它,我会接受。 lapply(l, function(x){ gather(x, key="type", value="value", -x) %&gt;% subset(!sum(!is.na(value)) == 0) }) %&gt;% bind_rows
    猜你喜欢
    • 2011-11-29
    • 2018-10-12
    • 2017-08-31
    • 1970-01-01
    • 1970-01-01
    • 2019-01-16
    • 2022-11-28
    • 2020-12-13
    相关资源
    最近更新 更多