在R中的data.table中使用eval,parse和as.character

时间:2017-01-14 12:57:11

标签: r data.table

我在运行data.table的eval,parse和as.character的组合时遇到了一些麻烦。我基本上想要将数据表的给定列转换为同一列的as.character输出。

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和parse函数工作正常,但是当使用:=更新列时,它似乎打破了。有人能告诉我这是什么问题吗?

1 个答案:

答案 0 :(得分:1)

我们可以使用data.table方法转换变量。指定'VARS'或'VARS'的子集,即.SDcols中的'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