2013-04-25 37 views
6

我希望使用矢量化操作更改數據表中所選變量的類別。我是data.table語法的新手,並且正在嘗試儘可能多地學習。我現在的問題是基本的,但它會幫助我更好地理解數據表的思維方式!重新分類數據表中的選擇列

有人問過類似的問題here!但是,解決方案似乎涉及重新分類僅一列或所有列。我的問題對於少數幾列是獨一無二的。

### 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] 

任何幫助,將不勝感激。我的數據很大,因此使用正則表達式創建要重新分類的列號向量是必要的。

謝謝你的時間。

回答

8

我認爲@ SimonO101了大部分工作的

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

您可以只使用:=魔法

+0

+1就是這樣!好的,因爲我的回答不正確,我將刪除它。 – 2013-04-25 21:53:21

+0

不,不,我學會了與你一樣的技巧('.SDCols')... – dickoa 2013-04-25 21:54:02

+2

(+1)你也可以直接傳遞'index'。數據[,c(索引):= lapply(.SD,as.character),.SDcols = index]' – Arun 2013-04-25 22:34:52

4

你只需要使用.SDcols和你的索引向量(我今天就知道了!),但那會只是返回一個數據表與reclassed列。 @dickoa的答案是你正在尋找的。

data <- data[, lapply(.SD, as.character) , .SDcols = index ] 
sapply(data , class) 
     id  height  weight 
"character" "character" "character" 
+0

這創建了一個只有「索引」列的新數據表。如何更改「索引」列的類別,並保持data.table的其餘部分的完整性?我可以很容易地看到如何使用merge或cbind來做到這一點,但必須有更優雅的方式! – Andreas 2013-04-25 21:47:59

+0

Argggh。你是對的。我知道這一點,但我也有句法問題。有一個簡單的方法 - 試圖記住正確的語法! – 2013-04-25 21:51:36

+0

這一點很重要。感謝您編輯您的回覆,以反映我們學到的內容! – Andreas 2013-04-25 22:01:32

9

您可以通過使用set避免內j.SD建設的開銷

for(j in index) set(data, j =j ,value = as.character(data[[j]])) 
+2

(+1)這對於2個帳戶是快速/高效的:1)沒有.SD和2)使用'set'而不是':='(後者具有'[.data.table'開銷]。輝煌! – Arun 2013-04-25 22:48:32

+2

@Arun,它甚至可以處理data.frames! – mnel 2013-04-25 22:51:09