基于R中计数器迭代的数据帧命名



我有一个循环,它会吐出一堆数据帧,并希望根据循环的当前迭代来命名数据帧,例如第一次迭代为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中,然后可以使用paste0setNames中命名它们,例如

> 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)

最新更新