删除零行数据框

时间:2016-04-28 21:48:53

标签: r dataframe

我有超过57个数据框,其中一些有零行。如何删除这些?

我尝试了以下代码

test=ls()    
rm(dim(test[1]==0))

并收到错误

Error in rm(dim(test[1] == 0)) : 
  ... must contain names or character strings

4 个答案:

答案 0 :(得分:7)

我们可以创建一个函数isEmpty(),它根据给定的" empty"的定义返回一个逻辑值。数据框是。这里我假设零列,并将维度总和为零。但在此之前,我们可以通过确定x是否是数据框来节省时间。然后我们可以使用eapply()在环境中应用我们的功能。最后,只需收集名称并像往常一样删除。

## create a function that returns a logical value
isEmpty <- function(x) {
    is.data.frame(x) && sum(dim(x)) == 0L
}
## apply it over the environment
empty <- unlist(eapply(.GlobalEnv, isEmpty))
## remove the empties
rm(list = names(empty)[empty])

注1:或者,isEmpty()可能是

isEmpty <- function(x) identical(x, data.frame())

注2:如果您只对零行感兴趣的数据框并允许列,请在上面的函数中将sum(dim(x)) == 0L更改为nrow(x) == 0L

注3:此答案假定所有57个数据帧都在全局环境中。如果它们在列表中(建议使用),则将eapply()更改为lapply()并将X更改为您的列表。

答案 1 :(得分:2)

您需要使用rm(list=)来避免此错误。

此代码应该有效:

test=ls()
rm(list=test[sapply(test,function(x) {
    d <- dim(get(x)); 
    length(d)==2 && sum(d)==0
    })])

删除具有以下内容的对象:

  • 他们的维度数为2
  • ,其每个维度为0

请注意,对于0行的data.frame,这不是一个好的条件:

dim( data.frame(a=c(1), b=c(2))[0] )
[1] 1 0

使用起来可能更安全:

 rm(list=test[sapply(test,function(x) class(get(x))=="data.frame" && length(get(x))==0)])

哪里

  • class()data.frame
  • length()为0

答案 2 :(得分:0)

时间说Wooo Wooo

这是解决方案

a&lt; - data.frame() b&lt; - data.frame(1:4,5:8)

  

测试= LS()   for(j in test){if(sum(dim(get(j))== 0)){rm(list = j)}}

其工作

我没有在rm()中使用get(),而是将数据框推送到列表

答案 3 :(得分:-1)

您应该提供一些可以使用的数据集,但这里没有一个例子:

制作一些数据

a <- data.frame()
b <- data.frame(1:4, 5:8)

获取现有df的测试

test <- ls()

一个已知的空df会给你什么? 0,0。

#> dim(a)
[1] 0 0

所以你可以测试nrow = 0的时候。你需要将test中存储的字符转换为实际变量

rm(dim(eval(parse(text = test[1])))[1] == 0)

以上使用

工作
eval(parse(text = test[1]))

将角色评估为变量名称。

您可以检查test [1]以测试[i]或编写一个apply函数来检查测试字符。