2013-04-25 18 views
6

Bir vektör tablosunda bir veri tablosunda seçilen değişkenlerin sınıfını değiştirmek istiyorum. Data.table sözdiziminde yeniyim ve olabildiğince öğrenmeye çalışıyorum. Şimdi soru temel, ama veri tablosunu düşünme şeklini daha iyi anlamama yardımcı olacak!Veri Tablosunda seçim sütunlarını yeniden sınıflandır Tablo

Benzer bir soru here! Bununla birlikte, çözüm sadece bir sütunu veya tüm sütunları yeniden sınıflandırmakla ilişkili görünüyor. Sorum şu seçilmiş birkaç sütuna özgüdür.

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

Herhangi bir yardım için teşekkür ederiz. Verilerim geniştir ve yeniden sınıflandırmak için sütun numaralarının bir vektörünü oluşturmak için normal ifadeler kullanmak gereklidir.

Zaman ayırdığınız için teşekkür ederiz.

cevap

8

Ben @ SimonO101 İşin en

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

sadece kullanabilirsiniz vermedi düşünüyorum := Sen set kullanarak j içinde .SD inşaatı yükü önlemek olabilir

+0

+1 işte bu kadar! Tamam, cevabım yanlış olduğu için onu sileceğim. –

+0

Hayır yapmayın, bu hileyi ('.SDCols') sizlerle birlikte öğrendim ... – dickoa

+2

(+1) 'indeks' de doğrudan geçebilirsiniz. data [, c (index): = lapply (.SD, as.character), .SDcols = index] ' – Arun

4

sadece (ki bugün öğrendim!) Senin indeksi vektörü ile .SDcols kullanmak gerekir, ama bu sadece yeniden sınıflandırılır sütunlu bir veri tablosu döndürür olacaktır. @dickoa'nın cevabı sizin aradığınız şeydir.

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

Bu, bir Sadece "dizin" sütunları ile yeni veri tablosu. "Index" sütunlarının sınıfını nasıl değiştirebilirim ve data.table'ın geri kalanını dokunutabilir miyim? Bunu birleştirme veya cbind kullanarak nasıl yapacağınızı kolayca görebilirim, ancak daha zarif bir yol olmalı! – Andreas

+0

Argggh. Haklısın. Bunu biliyorum ama aynı zamanda sözdizimi ile de sorun yaşıyorum. Doğru bir söz var - doğru sözdizimini hatırlamaya çalışıyorum! –

+0

Not etmek önemlidir. Ne öğrendiğimizi yansıtmak için cevabınızı düzenlediğiniz için teşekkür ederiz! – Andreas

9

sihirli

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

(+1) Bu, 2 hesapta hızlı/verimli: 1) no .SD ve 2) 'yerine' set kullanılarak ': =' (ikincisi '[.data.table' ek yüküne sahiptir]. Parlak! – Arun

+2

@Arun, data.frames üzerinde bile çalışacak! – mnel

İlgili konular