如何删除少于3个变量的数据框?我试过这个:
`1001.AFG.1.A`<-data.frame(x = 1, y = 1:10)
apply(ls(), function(x) {if (dim(x)[2]<3) rm(x)})
错误消息是:
Error in match.fun(FUN) : argument "FUN" is missing, with no default
答案 0 :(得分:3)
您可能想尝试:
sapply(ls(), function(x) {
if (is.data.frame(get(x)) && dim(get(x))[2]<3) rm(list=x,envir=.GlobalEnv)
})
我想要抑制打印,你可以这样做:
invisible(sapply(ls(), function(x) {
if (is.data.frame(get(x)) && dim(get(x))[2]<3) rm(list=x,envir=.GlobalEnv)
}))
答案 1 :(得分:3)
1)第一行生成一个命名逻辑向量to.rm
,每个对象都有一个组件,如果该对象应该被删除则为TRUE,否则为FALSE。因此names(to.rm)[to.rm]
是要删除的对象,因此将其输入rm
。通过将其分为两个步骤,可以在实际执行to.rm
之前审核rm
。
to.rm <- unlist(eapply(.GlobalEnv, function(x) is.data.frame(x) && ncol(x) < 3))
rm(list = names(to.rm)[to.rm], envir = .GlobalEnv)
如果直接输入到全局环境中(即没有放入功能),则最后一行中的envir = .GlobalEnv
是默认值,可以省略。
2)另一种方法是遍历env
的对象名称,如图所示。我们提供了一个verbose
参数来显示它正在做什么,并提供一个dryrun
参数来显示它将删除的内容而不实际删除任何内容。
rm2 <- function(env = .GlobalEnv, verbose = FALSE, dryrun = FALSE, all.names = FALSE) {
for(nm in ls(env, all.names = all.names)) {
obj <- get(nm, env)
if (is.data.frame(obj) && ncol(obj) < 3) {
if (verbose || dryrun) cat("removing", nm, "\n")
if (!dryrun) rm(list = nm, envir = env)
}
}
}
rm2(dryrun = TRUE)
rm2(verbose = TRUE)
更新在(1)中向envir
添加了rm
参数。它已经在(2)。
更新2 次要改动为(2)。