R “在”期间根据条件删除列表中的元素;“循环”;
我正在处理一个非常大的大型数据帧列表(~2GB)。为了节省空间和减小文件大小,我想删除列表中所有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,
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