【问题标题】:Delete "empty" entries in a list删除列表中的“空”条目
【发布时间】:2014-05-14 03:14:13
【问题描述】:
我有一个list,每个条目都是一个data.frame。我还编写了一个函数,试图清除具有零行的 data.frames:
delete_zeroes <- function(data){
if(nrow(data) == 0){
return(NULL)
}
(data)
}
llply(data, delete_zeroes)
但是,这似乎只是将NULL 放在匹配的条目上。我想完全摆脱每个匹配的条目。我怎样才能做到这一点?
【问题讨论】:
标签:
r
function
data-manipulation
【解决方案1】:
您可以使用逻辑索引来排除具有 data.frame 且没有行的每个项目:
# example data
l <- list(a=data.frame(a=1:3), b=data.frame(), c=data.frame(a=1:3))
# $a
# a
# 1 1
# 2 2
# 3 3
#
# $b
# data frame with 0 columns and 0 rows
#
# $c
# a
# 1 1
# 2 2
# 3 3
nr <- sapply(l, nrow)
# a b c
# 3 0 3
l <- l[nr > 0]
# $a
# a
# 1 1
# 2 2
# 3 3
#
# $c
# a
# 1 1
# 2 2
# 3 3
【解决方案2】:
你可以试试
sapply(LL, nrow) 将为您提供列表中每个data.frame 中包含行数的向量。
您将其与 0 进行比较,以获得逻辑向量用作子集列表的索引
LL <- list(data.frame(1:2), data.frame(), data.frame(3:4))
## [[1]]
## X1.2
## 1 1
## 2 2
## [[2]]
## data frame with 0 columns and 0 rows
## [[3]]
## X3.4
## 1 3
## 2 4
LL[sapply(LL, nrow) != 0]
## [[1]]
## X1.2
## 1 1
## 2 2
## [[2]]
## X3.4
## 1 3
## 2 4
【解决方案3】:
尝试以下方法:
Filter(nrow, data)