从列表中的多个数据帧中删除等于0的列;在将函数应用于列表

时间:2018-03-29 23:54:34

标签: r list lapply

我有三个相似的数据框列表(列数相同但行数不同),并从较大的数据集中拆分。 下面是一些示例代码,用于生成三个数据框并将它们放在一个列表中。由于文件太大(超过400列,前6列不是数字),因此很难对数据进行精确复制。

a <- c(0,1,0,1,0,0,0,0,0,1,0,1)
b <- c(0,0,0,0,0,0,0,0,0,0,0,0)
c <- c(1,0,1,1,1,1,1,1,1,1,0,1)
d <- c(0,0,0,0,0,0,0,0,0,0,0,0)
e <- c(1,1,1,1,0,1,0,1,0,1,1,1)
f <- c(0,0,0,0,0,0,0,0,0,0,0,0)
g <- c(1,0,1,0,1,1,1,1,1,1)
h <- c(0,0,0,0,0,0,0,0,0,0)
i <- c(1,0,0,0,0,0,0,0,0,0)
j <- c(0,0,0,0,1,1,1,1,1,0)
k <- c(0,0,0,0,0)
l <- c(1,0,1,0,1)
m <- c(1,0,1,0,0)
n <- c(0,0,0,0,0)
o <- c(1,0,1,0,1)

df1 <- data.frame(a,b,c,d,e,f)
df2 <- data.frame(g,h,i,j)
df3 <- data.frame(k,l,m,n,o)
my.list <- list(df1,df2,df3)

我希望删除总数== 0的每个数据框中的所有列。代码如下:

list2 <- lapply(my.list, function(x) {x[, colSums(x) != 0];x})
list2 <- lapply(my.list, function(x) {x[, colSums(x != 0) > 0];x})

以上两个代码都会运行,但实际上都没有删除列== 0。 我不确定为什么会这样,任何提示都非常感谢

1 个答案:

答案 0 :(得分:1)

OP通过与我交换意见找到了解决方案。但我想删除以下内容。在lapply(my.list, function(x) {x[, colSums(x) != 0];x})中,OP要求R做两件事。第一件事是在my.list中对每个数据框进行子集化。第二件事是展示每个数据框架。我认为他认为在对列进行子集化后,每个数据框都已更新。但他只是要求R显示第二个命令中的每个数据帧。所以R显示第二个命令的结果。 (表面上看,他没有看到任何变化。)如果我按照他的方式行事,我会做这样的事情。

lapply(my.list, function(x) {foo <- x[, colSums(x) != 0]; foo})

他想在匿名函数中创建一个临时对象并返回该对象。或者,他想做以下事情。

lapply(my.list, function(x) x[, colSums(x) != 0])

对于my.list中的每个数据框,对每列运行逻辑检查。如果colSums(x) != 0为TRUE,请保留该列。否则将其删除。希望这将有助于未来的读者。

[[1]]
   a c e
1  0 1 1
2  1 0 1
3  0 1 1
4  1 1 1
5  0 1 0
6  0 1 1
7  0 1 0
8  0 1 1
9  0 1 0
10 1 1 1
11 0 0 1
12 1 1 1

[[2]]
   g i j
1  1 1 0
2  0 0 0
3  1 0 0
4  0 0 0
5  1 0 1
6  1 0 1
7  1 0 1
8  1 0 1
9  1 0 1
10 1 0 0

[[3]]
  l m o
1 1 1 1
2 0 0 0
3 1 1 1
4 0 0 0
5 1 0 1