2017-01-14 4 views
0

У меня возникли проблемы с выполнением комбинации 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 для преобразования переменных. Укажите «VARS» или подмножество «VARS», то есть «VARS [j]» в .SDcols, проведите по столбцам (в случае, если мы хотим, чтобы цикл для нескольких столбцов) и назначили (:=) столбцам, указанным в «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

Спасибо Akrun. Из любопытства, есть ли способ сделать это, не используя функции лапши или sapply? Я просто хочу понять, что происходит в моем текущем коде, поэтому я могу внести минимальные изменения в код. –

+1

@Ramateur. Это стандартный способ data.table для этого, и он должен быть эффективен по сравнению с применением полного набора данных. В вашем коде 'eval (parse (text' также используется в lhs': = ', который не делает то, что вы намеревались. Кроме того, не рекомендуется проходить через' eval (parse' route. – akrun

Смежные вопросы