2013-04-25 10 views
6

データテーブル内の選択された変数のクラスを、ベクトル化操作を使用して変更したいとします。私はdata.table構文が新しく、できるだけ覚えようとしています。私は今質問は基本的ですが、それは私がより良い考え方を理解するのに役立ちます!データテーブルの選択列を再分類

同様の質問がありましたhere!しかし、この解決策は、ただ1つの列またはすべての列を再分類することに関係していると思われる。私の質問は、いくつかの選択された列に固有です。

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

あなただけ使用することができなかったと思い:=あなたはsetを使用してj.SDの建設のオーバーヘッドを避けることができ

+0

+1それはそれだ!私の答えが間違っているので、私はそれを削除するつもりです。 –

+0

いいえ、私はあなたとそのトリック( '.SDCols')を学んだので... – dickoa

+2

(+1)あなたは' index'も直接渡すことができます。 '.SDcols'を使わずに、' data [、c(index):= lapply(.SD、as.character)、.SDcols = index] ' – Arun

4

インデックスベクトルに.SDcolsを使用するだけでよいですが、それはとなります。は、再分類された列を含むデータテーブルを返します。 @ディコアの答えは、あなたが探しているものです。

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

これにより、 「インデックス」列のみを持つ新しいデータテーブル。 「インデックス」列のクラスを変更するにはどうしたらいいですか?私は簡単にマージやcbindを使ってこれを行う方法を見ることができますが、もっとエレガントな方法が必要です! – Andreas

+0

Argggh。あなたが正しいです。私はこれを知っていますが、構文にも問題があります。簡単な方法があります - 正しい構文を覚えようとしています! –

+0

これは重要なことです。私たちが学んだことを反映するようにあなたの応答を編集してくれてありがとう! – Andreas

9

マジック

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

(+1)これは2つのアカウントで速く/効率的です:1).SDと2) ':='の代わりに 'set'を使います(後者は' .data.table'オーバーヘッドを持ちます)。ブリリアント! – Arun

+2

@Arun、それはdata.framesでも動作します! – mnel

関連する問題