6

我希望使用矢量化操作更改数据表中选定变量的类别。我是 data.table 语法的新手,并且正在尝试尽可能多地学习。我现在的问题是基本的,但它会帮助我更好地理解数据表的思维方式!

类似的问题在这里被问到了!但是,该解决方案似乎与仅重新分类一列或所有列有关。我的问题在少数几列中是独一无二的。

### Load package
require(data.table)

### Create pseudo data
data <- data.table(id     = 1:10,
                   height = rnorm(10, mean = 182, sd = 20),
                   weight = rnorm(10, mean = 160, sd = 10),
                   color  = rep(c('blue', 'gold'), times = 5))

### Reclass all columns
data <- data[, lapply(.SD, as.character)]

### Search for columns to be reclassed
index <- grep('(id)|(height)|(weight)', names(data))

### data frame method
df <- data.frame(data)
df[, index] <- lapply(df[, index], as.numeric)

### Failed attempt to reclass columns used the data.table method
data <- data[, lapply(index, as.character), with = F]

任何帮助,将不胜感激。我的数据很大,因此有必要使用正则表达式创建列号向量来重新分类。

感谢您的时间。

4

3 回答 3

9

您可以通过使用来避免.SD内部构造的开销jset

for(j in index) set(data, j =j ,value = as.character(data[[j]]))
于 2013-04-25T22:39:53.790 回答
8

我认为@SimonO101 完成了大部分工作

data[, names(data)[index] := lapply(.SD, as.character) , .SDcols = index ]

你可以使用:=魔法

于 2013-04-25T21:52:25.413 回答
4

你只需要使用.SDcols你的索引向量(我今天才知道!),但这只会返回一个包含重新分类列的数据表。@dickoa 的答案就是您要找的。

data <- data[, lapply(.SD, as.character) , .SDcols = index ]
sapply(data , class)
        id      height      weight 
"character" "character" "character" 
于 2013-04-25T21:44:33.020 回答