如何更改数据框的名称

How can I change the name of a data frame

我经常遇到一种情况,我在一长串 R 代码的顶部设置了一个值,该代码用于对一个或多个数据帧进行子集化。像这样:

city_code <- "202"

在整个过程结束时,我想将结果保存在一个适当命名的数据框中,例如,基于将 "city_code" 附加到一个公共存根。

city_results <- paste("city_stats", city_code, sep = "")

我的问题是我不知道如何将生成的数据框重命名为 'city_results' 的值。那里有很多关于如何重命名数据框列的信息,但没有关于如何重命名数据框本身的信息。根据建议的答案,这里有一个澄清:

谢谢,@mike-wise。有助于学习 Hadley 的 Advanced R 和手头的具体问题。

library(dplyr)
gear_code <- 4
gear_subset <- paste("mtcars_", gear_code, sep = "")
mtcars_subset <- mtcars %>% filter(gear == gear_code)
head(mtcars_subset)
write.csv(mtcars_subset, file = paste(gear_subset, ".csv", sep = ""))

这让我可以将子集写入适当命名的 csv 文件。但是,您的建议是可行的,但我不能,例如,用新名称引用 data.frame:

assign(gear_subset, mtcars_subset)
head(gear_subset)

事实上,R 中的对象本身没有名称。存在不同类型的环境,包括针对每个进程的全局环境。这些环境有名称列表,指向各种对象。两个不同的名字可以指向同一个对象。据我所知,这在 Hadley Wickhams Advanced R 书的环境章节中得到了最好的解释 http://adv-r.had.co.nz/Environments.html

因此无法更改数据框的名称,因为没有什么可更改的。

但是您可以使一个新名称(如 newname)指向与给定名称(如 oldname)相同的对象(在你的例子中是数据框对象),只需执行以下操作:

   newname <- oldname

请注意,如果您更改其中一个变量,将创建一个新副本,并且内部引用将不再相同。这是由于 R 的 "Copy on modify" 语义。请参阅此 post 以获取解释:What exactly is copy-on-modify semantics in R, and where is the canonical source?

希望对您有所帮助。我知道痛苦。动态和函数式语言不同于静态和过程式语言...

当然可以计算数据框的新名称并使用 assign 命令在环境中注册它 - 也许您正在寻找这个。不过后面再提起来就比较费劲了

示例(假设 df 是有问题的数据框):

   assign(  paste("city_stats", city_code, sep = ""), df )

一如既往地查看 assign 的帮助以获取更多信息 http://stat.ethz.ch/R-manual/R-devel/library/base/html/assign.html

编辑: 在回复您的编辑以及有关使用 eval(parse(...) 问题的各种评论时,您可以这样解析名称:

head(get(gear_subset))

通常,您不应该 以编程方式为全局环境中的数据框生成名称。这很好地表明您应该使用 list 让您的生活更简单。有关许多示例和更多讨论,请参阅常见问题 How to make a list of data frames?

使用你的具体例子,我会用几种不同的方式之一重写它。

library(dplyr)
gear_code <- 4
gear_subset <- paste("mtcars_", gear_code, sep = "")
mtcars_subset <- mtcars %>% filter(gear == gear_code)
head(mtcars_subset)
write.csv(mtcars_subset, file = paste(gear_subset, ".csv", sep = ""))

目标似乎是编写一个名为 gear_X.csv 的 CSV,其中包含 mtcars 子集和 gear == X。你不要保留中间数据框,这应该没问题:

gear_code <- 4
mtcars %>% filter(gear == gear_code) %>%
    write.csv(file = paste0('mtcars_', gear_code, '.csv'))

但您之所以以这种方式编码,可能是因为您想对 gear 的每个值都这样做,而这正是 dplyrgroup_by 提供帮助的地方:

所有齿轮的 CSV

mtcars %>% group_by(gear) %>%
  do(csv = write.csv(file = sprintf("mt_gear_%s.csv", .[1, "gear"]), x = .)

每个档位的数据帧:

如果您真的想要每个齿轮级别的单独数据框对象,将它们保存在列表中是可行的方法。

gear_df = split(mtcars, mtcars$gear)

这为您提供了一个包含三个数据框的 list,一个对应 gear 的每个级别。它们已经用级别命名,所以要查看包含所有 gear == 4 行的数据框,请执行

gear_df[["4"]]

一般来说,这比三个浮动的数据框更容易处理。任何您想对所有数据帧执行的操作都可以使用单个 lapply 同时执行,即使您想使用 for 循环也比 eval(parse()) 或更简单get().