その場で変数に名前を付ける方法は?


96

その場で新しい変数名を作成することは可能ですか?

リストからデータフレームを読み取り、最後に数字が付いた新しい変数に入れたいのですが。orca1、orca2、orca3のようなもの...

私が何かをしようとすると

paste("orca",i,sep="")=list_name[[i]]

このエラーが出ます

target of assignment expands to non-language object

これを回避する別の方法はありますか?


10
r-faqタグを提供している限り、リンクを提供しましょう(FAQ 7.21:cran.r-project.org/doc/FAQ/…
Ben Bolker '19年

回答:


118

使用assign

assign(paste("orca", i, sep = ""), list_name[[i]])

28
これがこれを行う方法です。ここにメタ質問があります。「これでいいですか?」答えはほとんど常に「ノー」です。ほとんどの場合、リスト内の名前付き要素が優先されます。
アリB.フリードマン

26
答えは、そうでない場合を除いて、ほとんどの場合「いいえ」です。
シェーン

9
もちろんです。しかし、この回答を求めるほとんどの人は、申請のリストを拒否したという立場からそうではありません。
アリB.フリードマン

@Ari B. Friedman mypackage / dataに保存するデータセットの変数名を生成します。ファイル内の各ファイルとファイル内のデータの同じ名前(パッケージ内のデータに関するRの推奨事項)。各データセットは約1000万で、合計は約17Goです。
cmbarbu 2016

3
使わなかった理由はpaste0なんですか?
BroVic 2018

33

それはあなたがリストを持つ方が良いのではなく使用したかもしれないと私には思えるorca1orca2など、...それは次のようになりorca[1]orca[2]...

通常は、数値のみで区別される変数のリストを作成します。これは、その数値が後で変数にアクセスするための便利な方法になるためです。

orca <- list()
orca[1] <- "Hi"
orca[2] <- 59

それ以外の場合は、assignまさにあなたが欲しいものです。


11
同意する。通常、その場で変数に名前を付けたいと思うとき、本当に欲しいのは別のデータ構造です。
Michael Dunn

9
+1(FAQ 7.21:cran.r-project.org/doc/FAQ/…)はこれについて上手く説明しています
Ben Bolker '19年

11

データフレームを作成しないでください。リストを保持し、その要素に名前を付けますが、アタッチしません。

これの最大の理由は、外出先で変数を作成する場合、ほとんどの場合、後で有用な何かを実行するためにそれらのそれぞれを反復する必要があることです。そこで、あなたは再びあなたがその場で作成した名前のそれぞれを繰り返すことを強いられます。

リストの要素に名前を付けて、名前を繰り返し処理する方がはるかに簡単です。

attachに関する限り、Rでのプログラミングは非常に悪いため、注意しないと多くの問題が発生する可能性があります。


それでは、アタッチを行いますが、リストを反復処理した後にのみですか?
Mox

4

FAQは言う:

あなたが持っている場合

varname <- c("a", "b", "d")

できるよ

get(varname[1]) + 2

ために

a + 2

または

assign(varname[1], 2 + 2)

ために

a <- 2 + 2

したがって、変数(連結など)を使用する式を評価する場合はGETを使用し、事前宣言された変数に値を割り当てる場合はASSIGNを使用するように見えます。

割り当ての構文: assign(x、value)

x:文字列として与えられる変数名。強制は行われず、長さが1より大きい文字ベクトルの最初の要素が使用され、警告が出されます。

value: xに割り当てられる値。


0

別のトリッキーな解決策は、リストの要素に名前を付けるattachことです。

list_name = list(
    head(iris),
    head(swiss),
    head(airquality)
    )

names(list_name) <- paste("orca", seq_along(list_name), sep="")
attach(list_name)

orca1
#   Sepal.Length Sepal.Width Petal.Length Petal.Width Species
# 1          5.1         3.5          1.4         0.2  setosa
# 2          4.9         3.0          1.4         0.2  setosa
# 3          4.7         3.2          1.3         0.2  setosa
# 4          4.6         3.1          1.5         0.2  setosa
# 5          5.0         3.6          1.4         0.2  setosa
# 6          5.4         3.9          1.7         0.4  setosa

14
トリッキーですが、賢明ではありません。答えがattachあなたが通常間違った質問をしているなら...
ベン・ボルカー'19年

-1

そしてこのオプション?

list_name<-list()
for(i in 1:100){
    paste("orca",i,sep="")->list_name[[i]]
}

それは完全に動作します。あなたが置いた例では、最初の行が欠落していて、エラーメッセージが表示されます。


3
これはOPの質問には対応していません。私たちは、データフレームのリストを持っている、と我々はなどorca1、orca2、という名前のデータフレーム、それを割り当てたい
zx8754

"データフレーム付きリスト" = "リストOFデータフレーム"?
Mox
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.