R:动态创建变量名称

时间:2014-07-11 14:21:58

标签: r for-loop dataframe assign

我希望使用for循环创建多个数据框,然后将它们与merge()拼接在一起。

我可以使用assign(paste(), blah)创建数据框。但是,在同一个for循环中,我需要删除每个数据帧的第一列。

以下是我的代码的相关部分:

for (j in 1:3)
{
    #This is to create each data frame
    #This works
    assign(paste(platform, j, "df", sep = "_"), read.csv(file = paste(masterfilename,    extension, sep = "."), header = FALSE, skip = 1, nrows = 100))

    #This is to delete first column
    #This does not work
    assign(paste(platform, j, "df$V1", sep = "_"), NULL)
}

在第一种情况下,我将变量分配给数据框,因此它们继承了该类型。但在第二种情况下,我将其分配给NULL

有没有人对如何解决这个问题有任何建议?此外,是否有比assign()更优雅的解决方案,这似乎让我的代码陷入困境?谢谢,

n.i。

2 个答案:

答案 0 :(得分:4)

assign可用于构建变量名,但“name $ V1”不是变量名。 $是R中的运算符,因此您尝试构建函数调用,而不能使用assign执行此操作。事实上,在这种情况下,最好完全避免assign。你不需要创建一堆不同的变量。如果data.frames是相关的,只需将它们保存在列表中即可。

mydfs <- lapply(1:3, function(j) {
    df<- read.csv(file = paste(masterfilename, extension, sep = "."), 
        header = FALSE, skip = 1, nrows = 100))
    df$V1<-NULL
    df
})

现在,您可以使用mydfs[[1]]mydfs[[2]]等访问它们。您可以使用任何*apply系列函数运行整个data.sets函数。

答案 1 :(得分:1)

正如@joran在评论中指出的那样,正确的方法是使用列表。但是如果你想坚持assign,你可以用

替换你的第二个陈述
assign(paste(platform, j, "df", sep = "_"), 
    get(paste(platform, j, "df", sep = "_"))[
        2:length(get(paste(platform, j, "df", sep = "_")))]

如果您想使用列表,则读取数据框的代码看起来像

dfs <- replicate(3,
    read.csv(file = paste(masterfilename, extension, sep = "."),
        header = FALSE, skip = 1, nrows = 100), simplify = FALSE)

请注意,您可以使用replicate,因为您对read.csv的调用不依赖于循环中的j。然后,您可以删除每个

的第一列
dfs <- lapply(dfs, function(d) d[-1])

或者,将所有内容组合在一个命令中

dfs <- replicate(3,
    read.csv(file = paste(masterfilename, extension, sep = "."),
        header = FALSE, skip = 1, nrows = 100)[-1], simplify = FALSE)