我有三个相似的数据框列表(列数相同但行数不同),并从较大的数据集中拆分。 下面是一些示例代码,用于生成三个数据框并将它们放在一个列表中。由于文件太大(超过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。 我不确定为什么会这样,任何提示都非常感谢
答案 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