我有一个循环,它会吐出一堆数据帧,并希望根据循环的当前迭代来命名数据帧,例如第一次迭代为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
有人知道我如何使用计数器信息创建数据帧名称吗?
这是对Richard的补充,因为它感觉有点太过实质,无法简单地编辑到他的中。
这类事情的典型代码模式是:
#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)
}
其中CCD_ 3的使用通常被认为是糟糕的(风格上)。如果数据帧的命名非常规则,那么您甚至不需要在循环中进行:
names(dfs) <- paste0("df",seq_along(dfs))
您可以按照上面的矢量化方式进行操作。正如我在下面提到的Richard的答案,即使将它们全部放在一个列表中,也不会比将它们作为单独的对象更糟糕,通常也会更好,但您可以通过以下方式将列表转换为单独的对象:
list2env(dfs,envir = .GlobalEnv)
与其用数据帧扰乱全局环境,最好将它们收集在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
正如joran所指出的,如果你坚持用这些数据帧填充全球环境,你可以使用
list2Env(dfList, envir = .GlobalEnv)
并且数据帧将被分配为全局环境中的对象。
使用assign
:
assign(paste0("df", counter), data.frame(x = (1:10), y = (10:1))
我想你正在寻找
assign("name", dataframe)