state1 <- "CA"
state2 <- "IL"
state3 <- "FL"
CA、IL 和 FL 是三个数据帧。如何编写一个循环来使用 paste("state", i) 删除这些数据帧,其中 i 是一个整数?假设有许多这样的数据帧,因此将它们一一删除将是低效的。
state1 <- "CA"
state2 <- "IL"
state3 <- "FL"
CA、IL 和 FL 是三个数据帧。如何编写一个循环来使用 paste("state", i) 删除这些数据帧,其中 i 是一个整数?假设有许多这样的数据帧,因此将它们一一删除将是低效的。
以下是方法,但您永远不必这样做:
CA <- data.frame()
IL <- data.frame()
FL <- data.frame()
ls()
[1] "CA" "FL" "IL"
rm(list=c("CA", "IL", "FL"))
ls()
character(0)
相反,您应该做的是将所有这些对象放在一个列表中,然后操作该列表:
states <- list(
CA = data.frame(),
IL = data.frame(),
FL = data.frame()
)
str(states)
List of 3
$ CA:'data.frame': 0 obs. of 0 variables
$ IL:'data.frame': 0 obs. of 0 variables
$ FL:'data.frame': 0 obs. of 0 variables
由于您的列表是单个对象,因此您可以使用简单的方法删除rm()
:
rm(states)
ls()
character(0)
如果您在字符向量中有数据框的名称,states
那么您可以使用
rm(list=states)
现在有多种获取方式states
只需创建它并在创建新状态变量时对其进行更新。例如
CA <- data.frame()
states <- "CA"
IL <- data.frame()
states <- c(states, "IL")
FL <- data.frame()
states <- c(states, "FL")
或者
如果你在变量中有对象的名称,比如state1
等等state2
。那么你可以按照大卫的建议去做
states = sapply(paste("state", 1:2, sep=""), get)
rm(list = states)
您可以像这样删除它们:
rm(list=sapply(paste("state", 1:50, sep=""), get))
但是,这是存储数据的不好方法(请参阅将数据保留在变量名之外)。更好的做法是将所有数据框保存为命名列表,以便您可以通过以下方式访问它们:
states[["CA"]]
states[["IL"]]
并使用以下命令一次性删除它们:
rm(states)
使用rm
and get
,但使用do.call
,更优雅,因为我们操作指令列表。
我假设 N 是状态数。
do.call(rm,lapply(paste("state", 1:N, sep=""), get))