我有一个循环,它将吐出一堆数据帧,并希望根据循环的当前迭代来命名数据帧,例如:第一次迭代df1
,第二次迭代df2
,依此类推。
但是,我在尝试使用循环迭代计数器构建数据框名称时遇到了问题。例如,让我们假设我在循环的第一次迭代中并想要命名数据帧:
counter <- 1
as.name(paste("df",counter,sep="")) <- data.frame(x = (1:10), y = (10:1))
我收到错误
Error in as.name(paste("df", counter, sep = "")) <- data.frame(x = (1:10), :
target of assignment expands to non-language object
有谁知道我如何使用计数器信息来创建数据框名称?
答案 0 :(得分:3)
最好不要在数据框架中混淆全球环境,而是最好在list
中收集它们,然后您可以使用paste0
在setNames
中将它们命名为> dfList <- setNames(list(data.frame(x = 1:10, y = 10:1)), paste0("df", 1))
。
> dfList$df1
x y
1 1 10
2 2 9
3 3 8
4 4 7
5 5 6
6 6 5
7 7 4
8 8 3
9 9 2
10 10 1
之后,您可以使用
引用数据框list2Env(dfList, envir = .GlobalEnv)
正如joran所说,如果你坚持使用这些数据框填充全球环境,你可以使用
{{1}}
,数据框将被指定为全局环境中的对象。
答案 1 :(得分:3)
这是为了补充理查德的,因为它感觉有点太大而不能简单地编辑成他的。
此类事情的典型代码模式是:
#Initialize an empty list of the desired length
dfs <- vector("list",3)
#Fill the list with data frames, naming as we go
for (i in seq_along(dfs)){
dfs[[i]] <- data.frame(x = runif(5),y = runif(5))
names(dfs)[[i]] <- paste0("df",i)
}
其中assign
的使用通常不赞成(风格)。如果数据帧的命名非常规则,您甚至不需要在循环中执行此操作:
names(dfs) <- paste0("df",seq_along(dfs))
你可以像上面那样以矢量化的方式做到这一点。正如我在下面提到的那样理查德的答案,即使将它们全部放在列表中也不会比将它们作为单独的对象更糟,通常更好,您可以通过以下方式将列表转换为单独的对象:
list2env(dfs,envir = .GlobalEnv)
答案 2 :(得分:1)
使用assign
:
assign(paste0("df", counter), data.frame(x = (1:10), y = (10:1))
答案 3 :(得分:0)
我认为你在寻找
assign("name", dataframe)