web-dev-qa-db-ja.com

データフレームの名前を変更するにはどうすればよいですか

1つ以上のデータフレームのサブセット化に使用される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)
7

真実は、R内のオブジェクトには名前自体がないということです。プロセスごとにグローバルな環境を含む、さまざまな種類の環境が存在します。これらの環境には、さまざまなオブジェクトを指す名前のリストがあります。 2つの異なる名前が同じオブジェクトを指すことができます。これは、Hadley Wickhams Advanced R book http://adv-r.had.co.nz/Environments.html

したがって、変更するものは何もないため、データフレームの名前を変更する方法はありません。

ただし、次の操作を行うだけで、新しい名前(newnameなど)が特定の名前(oldnameなど)と同じオブジェクト(この場合はデータフレームオブジェクト)を指すようにできます。

_   newname <- oldname
_

これらの変数のいずれかを変更すると、新しいコピーが作成され、内部参照は同じではなくなることに注意してください。これは、Rの「変更時にコピー」セマンティクスによるものです。説明については、この投稿を参照してください: Rのコピーオンモディファイセマンティクスとは何ですか?また、正規のソースはどこにありますか?

お役に立てば幸いです。私は痛みを知っています。動的言語と機能言語は、静的言語と手続き型言語とは異なります...

もちろん、データフレームの新しい名前を計算し、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))
_
15
Mike Wise

通常、グローバル環境でデータフレームの名前をプログラムで生成することはできません。これは、listを使用して生活を簡素化する必要があることを示しています。多くの例と詳細については、FAQ データフレームのリストの作成方法 を参照してください。

具体例を使用して、いくつかの異なる方法の1つで書き直します。

_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_のmtcarsサブセットを持つ_gear == X_というCSVを作成することです。中間のデータフレームを保持しないでください。これで問題ありません。

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

しかし、おそらくgearの各値に対してそれを実行したいので、このようにコーディングしているのでしょう。そして、これはdplyrの_group_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の各レベルに1つずつ、3つのデータフレームのgearが得られます。そして、それらはすでにレベルで名前が付けられているので、すべての_gear == 4_行を持つデータフレームを見るには、

_gear_df[["4"]]
_

一般的に、これは3つのデータフレームが浮かんでいるよりも簡単に操作できます。単一のlapplyで同時に実行できるすべてのデータフレームに対して実行するすべての処理、およびforループを使用する場合でも、eval(parse())よりも簡単ですまたはget()

1
Gregor