有条件地从环境中删除数据帧

Conditionally remove data frames from environment

如何删除少于 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

您可能想试试:

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) 第一行生成一个命名的逻辑向量,to.rm 每个对象都有一个组件,如果应该删除该对象则为 TRUE,否则为 FALSE。因此 names(to.rm)[to.rm] 是要删除的对象,因此将其输入 rm。通过将它分成两个步骤,这让一个人在实际执行 rm.

之前回顾 to.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) 中的 rm 添加了 envir 参数。它已经在(2)中。

更新 2 对 (2) 的小改进。