根据R中的计数器迭代命名数据帧?

时间:2014-09-18 19:37:48

标签: 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

有谁知道我如何使用计数器信息来创建数据框名称?

4 个答案:

答案 0 :(得分:3)

最好不要在数据框架中混淆全球环境,而是最好在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

之后,您可以使用

引用数据框
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)