R:从工作空间中删除有0行的所有数据帧(即为空)

时间:2016-10-20 13:45:05

标签: r dataframe

我知道这应该很容易,但我对如何解决这个问题感到困惑。 我有一堆数据框,有些是空的(0行,42个变量),有些数据框中包含来自前一个工作步骤的信息(x行,42个变量)。我现在只想删除所有0行。 首先,我通过

获得所有DF
 alldfnames <- which(unlist(eapply(.GlobalEnv,is.data.frame)))

其次,我尝试编写一个区分数据框的函数:

isFullDF <- function(x) dim(x)[1] > 0

第三,我试图

  for (i in seq_along(alldfnames)) { 
     if(isFullDF(alldfnames[i]) == FALSE){
       rm(alldfnames[i])
    } else {
      # do nothing
   }
 }

但这给了我(现在几个小时)一个错误:

  

if(isFullDF(alldfnames [i])== FALSE){:
出错     参数长度为零

有什么想法吗?

3 个答案:

答案 0 :(得分:1)

首先,如果你看alldfnames,你会看到它是一个整数向量,其中names(alldfnames)是你所追求的变量的名称。所以alldfnames[i]只是一个数字。所以你需要

alldfnames <- names(alldfnames)

是df名称的字符向量。

接下来,当您执行dim(x)和(例如)您的环境中有一个名为df的数据框时,x字符“df”而不是数据框。所以你需要检索它。您可以使用get

isFullDF <- function(x) nrow(get(x)) > 0

然后当你rm时,你需要告诉R你要移除的东西是带有你要删除的东西的名称的字符串。而不是删除名为alldfnames[i]的对象。即

rm(list=alldfnames[i])

(另外,如果它是空的,你不需要else { }。)

答案 1 :(得分:0)

使用Filter

alldfnames = names(which(unlist(eapply(.GlobalEnv,is.data.frame))))

rowCounts = sapply(alldfnames,function(x) ifelse(nrow(get(x))==0,1,0))

emptyDF = names(Filter(function(f) f==1, rowCounts))

rm(list = emptyDF)

答案 2 :(得分:-1)

尝试:

x <- eapply(.GlobalEnv,is.data.frame)
alldfnames <- names(x[x==T])

现在alldfnames包含您环境中的所有数据框名称,然后使用以下函数:

isFullDF <- function(nm) nrow(get(nm))>0

然后是这个单行代码,而不是你的for循环:

rm(list = alldfnames[!sapply(alldfnames, isFullDF)])