2014-07-05 25 views
23

Bir dizi data.tables'i benzer yollarla işlemeye çalışıyorum ve bunu gerçekleştirmek için bir işlev yazmak istiyorum. İşlemlerin gerçekleştirileceği sütunların listesini içeren bir parametreyi iletmek istiyorum. Bu, sütunların vektör beyanı: = operatörün sol tarafı olduğunda, ancak daha önce bildirilmişse (veya işleve geçirilmişse) iyi çalışır. Takip kodu sorunu gösterir.R data.table öğesinden birden çok sütunun kaldırılması için sütunlar parametresiyle kaldırılacak

dt = data.table(a = letters, b = 1:2, c=1:13) 
colsToDelete = c('b', 'c') 
dt[,colsToDelete := NULL] # doesn't work but I don't understand why not. 
dt[,c('b', 'c') := NULL] # works fine, but doesn't allow passing in of columns 

hatası "yeni bir sütun 'colsToDelete' sonra NULL (silme) atama ekleme" dir. Açıkçası, 'colsToDelete' yeni bir sütun adı olarak yorumlanıyor. Ben R yeni bu satırların

dt[, colNames := lapply(.SD, adjustValue, y=factor), .SDcols = colNames] 

boyunca bir şey yapıyor, ama bazı başka dillerde ziyade daha deneyimli zaman

aynı sorun oluşursa, bu nedenle bu saçma bir soru olabilir.

cevap

33

Temel olarak, kolaylık sağlamak amacıyla := LHS'deki sembollere izin vermek için kolaylık sağlamak amacıyla: ex: DT[, col := val]. Bu nedenle, col numaralı kutuda saklanan her ne olursa olsun, col'un adını ayırt etmek için LHS'nin name veya expression olduğunu kontrol ederiz.

Bu, name ise, LHS'de olduğu gibi adı olan sütunu ekler ve expression ise değerlendirilir.

DT[, col := val] # col is the column name. 

DT[, (col) := val] # col gets evaluated and replaced with its value 
DT[, c(col) := val] # same as above 

tercih deyim geçerli: dt[, (colsToDelete) := NULL]

HTH

3

önceki yanıta uzatmak için yaptığını referans olarak sütunları silebilirsiniz:

# delete columns 10 to 15 
dt[ , (10:15) := NULL ] 

veya

# delete columns 3, 5 and 10 to 15 
dt[ , (c(3,5,10:15)) := NULL ] 
İlgili konular