有条件地从环境中删除数据帧
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) 的小改进。
如何删除少于 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) 的小改进。