我知道这应该很容易,但我对如何解决这个问题感到困惑。 我有一堆数据框,有些是空的(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){:
出错 参数长度为零
有什么想法吗?
答案 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)])