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

时间:2015-01-28 15:04:00

标签: r dataframe

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

2 个答案:

答案 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)。

相关问题