簡體   English   中英

如何更改數據框的名稱

[英]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的“復制修改”語義。 請參閱這篇文章以獲得解釋: R中的copy-on-modify語義到底是什么,以及規范來源在哪里?

希望有所幫助。 我知道痛苦。 動態和函數語言與靜態和過程語言不同......

當然,可以計算數據幀的新名稱,並使用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(...)的問題的各種評論eval(parse(...)你可以像這樣解析名稱:

head(get(gear_subset))

通常,您不應該以編程方式為全局環境中的數據框生成名稱。 這是一個很好的跡象,表明您應該使用list來簡化您的生活。 請參閱常見問題解答如何制作數據框列表? 對於許多例子和更多的討論。

使用您的具體示例,我將以幾種不同的方式重寫它。

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,其中mtcarsgear == Xmtcars子集。 你不要保留一個中間數據框,這應該沒問題:

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同時執行這些lapply ,即使您想使用for循環,它也比eval(parse())get()更簡單。

再次加載並更改名稱

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM