我有超过57个数据框,其中一些有零行。如何删除这些?
我尝试了以下代码
test=ls()
rm(dim(test[1]==0))
并收到错误
Error in rm(dim(test[1] == 0)) :
... must contain names or character strings
答案 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
})])
删除具有以下内容的对象:
请注意,对于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函数来检查测试字符。