web-dev-qa-db-ja.com

Rで変数名として認識される文字列を取得する

関連: Rの変数参照としての文字列
おそらく関連: 式を連結してデータフレームをサブセット化


コメントリクエストごとに質問を簡略化しました。ここにいくつかのサンプルデータがあります。

_dat <- data.frame(num=1:10,sq=(1:10)^2,cu=(1:10)^3)
set1 <- subset(dat,num>5)
set2 <- subset(dat,num<=5)
_

次に、これらからバブルプロットを作成したいと思います。私は3+色と複雑なサブセットを持つより複雑なデータセットを持っていますが、私はこのようなことをします:

_symbols(set1$sq,set1$cu,circles=set1$num,bg="red")
symbols(set2$sq,set2$cu,circles=set2$num,bg="blue",add=T)
_

私はこのようなforループをしたいです:

_colors <- c("red","blue")
sets <- c("set1","set2")
vars <- c("sq","cu","num")

for (i in 1:length(sets)) {
   symbols(sets[[i]][,sq],sets[[i]][,cu],circles=sets[[i]][,num],
   bg=colors[[i]],add=T)
}    
_

列を指定するために変数を評価できることはわかっています(_var="cu"; set1[,var]_など; data.frame自体(および列を評価する別の変数)を指定する変数を取得する方法を知りたいです。


更新:この例のあるr-bloggersで この投稿 を走りました:

_x <- 42
eval(parse(text = "x"))
[1] 42
_

私は今このようなことをすることができます:

_eval(parse(text=paste(set[[1]],"$",var1,sep="")))
_

これをいじくり回すと、次のものが同等ではないことがおもしろいと思います。

_vars <- data.frame("var1","var2")
eval(parse(text=paste(set[[1]],"$",var1,sep="")))
eval(parse(text=paste(set[[1]],"[,vars[[1]]]",sep="")))
_

私は実際にこれをしなければなりません:

_eval(parse(text=paste(set[[1]],"[,as.character(vars[[1]])]",sep="")))
_

Update2:上記は値を出力するために機能しますが、プロットしようとはしません。私にはできません:

_for (i in 1:length(set)) {
symbols(eval(parse(text=paste(set[[i]],"$",var1,sep=""))),
       eval(parse(text=paste(set[[i]],"$",var2,sep=""))),
       circles=paste(set[[i]],".","circles",sep=""),
       fg="white",bg=colors[[i]],add=T)
}
_

_invalid symbol coordinates_を取得します。 set [[1]]のクラスを確認しましたが、これが要因です。 is.numeric(as.numeric(set[[1]]))を実行すると、TRUEが取得されます。 evalステートメントの前に上記を追加しても、エラーが発生します。奇妙なことに、私はこれを行うことができます:

_set.xvars <- as.numeric(eval(parse(text=paste(set[[i]],"$",var1,sep=""))))
set.yvars <- as.numeric(eval(parse(text=paste(set[[i]],"$",var2,sep=""))))
symbols(xvars,yvars,circles=data$var3)
_

変数として保存された場合とシンボル関数内で実行された場合の動作が異なるのはなぜですか?

46
Hendy

1つの答え、つまりeval(parse())が見つかりました。また、実装がより簡単なdo.call()を調査することもできます。文字列を変数名に変換するための便利なas.name()ツールも覚えておいてください。

34
Carl Witthoft

タイトルの質問に対する基本的な答えは、Josh O'Brienが使用しているeval(as.symbol(variable_name_as_string))です。例えば.

var.name = "x"
assign(var.name, 5)
eval(as.symbol(var.name)) # outputs 5

またはもっと簡単に:

get(var.name) # 5
16
CJB

サンプルデータがなければ、正確に知りたいことは本当に難しいです。たとえば、あなたのオブジェクトset(またはsets)がどのようなものか、まったく神聖なものではありません。

とはいえ、次のことはまったく役に立ちますか?

_set1 <- data.frame(x = 4:6, y = 6:4, z = c(1, 3, 5))

plot(1:10, type="n")
XX <- "set1"
with(eval(as.symbol(XX)), symbols(x, y, circles = z, add=TRUE))
_

[〜#〜] edit [〜#〜]

あなたの本当の仕事を見たので、ここにfor()ループを必要とせずにあなたが望むすべてをするワンライナーがあります:

_with(dat, symbols(sq, cu, circles = num,
                  bg = c("red", "blue")[(num>5) + 1]))
_

奇妙に感じるかもしれない1ビットのコードは、背景色を指定するビットです。次の2行を試して、動作を確認します。

_c(TRUE, FALSE) + 1
# [1] 2 1
c("red", "blue")[c(F, F, T, T) + 1]
# [1] "red"  "red"  "blue" "blue"
_
9
Josh O'Brien

文字列を変数名として使用する場合、assignを使用できます。

var1="string_name"

assign(var1, c(5,4,5,6,7))

string_name 

[1] 5 4 5 6 7
8
harris11

データのサブセット化とそれらの結合は不要です。これらの操作はベクトル化されるため、ループも同様です。前回の編集から、バブルプロットを作成するためにこれらすべてを行っていると思います。それが正しければ、おそらく以下の例が役立ちます。これで大丈夫なら、答えを削除するだけです。

library(ggplot2)
# let's look at the included dataset named trees.
# ?trees for a description
data(trees)
ggplot(trees,aes(Height,Volume)) + geom_point(aes(size=Girth))
# Great, now how do we color the bubbles by groups?
# For this example, I'll divide Volume into three groups: lo, med, high
trees$set[trees$Volume<=22.7]="lo"
trees$set[trees$Volume>22.7 & trees$Volume<=45.4]="med"
trees$set[trees$Volume>45.4]="high"

ggplot(trees,aes(Height,Volume,colour=set)) + geom_point(aes(size=Girth))


# Instead of just circles scaled by Girth, let's also change the symbol
ggplot(trees,aes(Height,Volume,colour=set)) + geom_point(aes(size=Girth,pch=set))

# Now let's choose a specific symbol for each set. Full list of symbols at ?pch
trees$symbol[trees$Volume<=22.7]=1
trees$symbol[trees$Volume>22.7 & trees$Volume<=45.4]=2
trees$symbol[trees$Volume>45.4]=3

ggplot(trees,aes(Height,Volume,colour=set)) + geom_point(aes(size=Girth,pch=symbol))
3
Maiasaura

私にとって最適なのは、quote()eval()を一緒に使用することです。

たとえば、for loopを使用して各列を印刷してみましょう。

Columns <- names(dat)
for (i in 1:ncol(dat)){
  dat[, eval(quote(Columns[i]))] %>% print
}
0
Arturo Sbr