2017-01-14 4 views
0

data.tableにeval、parse、as.characterの組み合わせを実行するのに問題があります。私は基本的には、データテーブルの特定の列を、同じ列のas.character出力に変換したいと考えています。その様子から、eval、parse、as.characterをdata.tableに入れてR

library(data.table) 
options(datatable.WhenJisSymbolThenCallingScope=TRUE) 
# an options that I heard may solve the problem 
iris2 <- data.table(iris) 
VARS <- colnames(iris) 
j <- 1 

iris2[,eval(parse(text = paste0(VARS[j])))] # this works fine 

iris2[,eval(parse(text = paste0(VARS[j]))) := as.character(eval(parse(text = paste0(VARS[j]))))] 
#but this fails 

、それはevalのを表示され、機能を解析し、正常に動作が、それはでカラムを更新することになると:=壊れているようです。誰かが問題の内容を教えてもらえますか?

+0

「VARS [j]:= ' – akrun

答えて

0

data.tableのメソッドを使用して変数を変換できます。 .SDcolsに 'VARS'または 'VARS'の 'VARS [j]'のサブセットを指定し、複数の列をループしたい場合は列をループし、 'VARS [j]で指定された列に(:=) ] `

iris2[, VARS[j] := lapply(.SD, as.character) , .SDcols = VARS[j]] 
str(iris2) 
#Classes ‘data.table’ and 'data.frame': 150 obs. of 5 variables: 
#$ Sepal.Length: chr "5.1" "4.9" "4.7" "4.6" ... 
#$ Sepal.Width : num 3.5 3 3.2 3.1 3.6 3.9 3.4 3.4 2.9 3.1 ... 
#$ Petal.Length: num 1.4 1.4 1.3 1.5 1.4 1.7 1.4 1.5 1.4 1.5 ... 
#$ Petal.Width : num 0.2 0.2 0.2 0.2 0.2 0.4 0.3 0.2 0.2 0.1 ... 
#$ Species  : Factor w/ 3 levels "setosa","versicolor",..: 1 1 1 1 1 1 1 1 1 
+0

ありがとうございます。好奇心のために、ラップやサップリーの機能を使わずにこれを行う方法はありますか?私は現在のコードで何がうまくいかないのか理解したいので、コードに最小限の変更を加えることができます –

+1

@Ramateurこれは標準的なdata.table方法です。あなたのコードでは 'eval(parse(text)'は意図したことをしない ':='のlhsでも使われていますが、 'eval(parse'ルート)を使うことは勧められません。 – akrun