2015-04-07 14 views
8

Aşağıdaki veri kümesi, büyük veri kümemin özelliklerine sahiptir. Ben data.table onu yönetiyorum, bazı sütunların numaralardır rağmen chr olarak yüklenir ve ben numerics dönüştürmek istiyoruz ve bu sütun adları Ben sayısal için bu 2 sütun dönüştürmek mümkün duyuyorum Belirli sütunlar için data.table içindeki sayısal karakter nasıl dönüştürülür?

dt = data.table(A=LETTERS[1:10],B=letters[1:10],C=as.character(runif(10)),D = as.character(runif(10))) # simplified version 
strTmp = c('C','D') # Name of columns to be converted to numeric 

# columns converted to numeric and returned a 10 x 2 data.table 
dt.out1 <- dt[,lapply(.SD, as.numeric, na.rm = T), .SDcols = strTmp] 

bilinmektedir edilir Yukarıdaki kod ile ancak bunun yerine dt güncellemek istiyorum. Kullanmaya çalıştım: = ancak işe yaramadı. Yardıma ihtiyacım var! (- Şu sipariş değişebilir bazı durumlarda endişeliyim gibi çalıştığını bile değil benim ideal çözüm data.frame gibi kodlanmış) ama hala çalışmıyor

dt.out2 <- dt[, strTmp:=lapply(.SD, as.numeric, na.rm = T), .SDcols = strTmp] # returned a 10 x 6 data.table (2 columns extra) 

Hatta aşağıdaki kodu çalıştı. Birisi neden çalışmıyor bilmeme izin verebilir mi lütfen? peşin

dt[,strTmp,with=F] <- dt[,lapply(.SD, as.numeric, na.rm = T), .SDcols = strTmp] 

teşekkürler!

cevap

7

, ayrıca bu gibi doğrudan olarak bir şey için bir döngü içinde set düşünebilirsiniz. Bir yaklaşım gibi bir şey olabilir: o hiç bir sorun sizin için hale gelirse ?set de

strTmp = c('C','D') 
ind <- match(strTmp, names(dt)) 

for (i in seq_along(ind)) { 
    set(dt, NULL, ind[i], as.numeric(dt[[ind[i]]])) 
} 

str(dt) 
# Classes ‘data.table’ and 'data.frame': 10 obs. of 4 variables: 
# $ A: chr "A" "B" "C" "D" ... 
# $ B: chr "a" "b" "c" "d" ... 
# $ C: num 0.308 0.564 0.255 0.828 0.128 ... 
# $ D: num 0.635 0.0485 0.6281 0.4793 0.7 ... 
# - attr(*, ".internal.selfref")=<externalptr> 

yardım sayfasından, bu [.data.table yükü bazı önleyeceğini.

+0

NULL niçin kullanıyorsunuz? – skan

+0

@skan, 'set' için dokümanlar bakın. "NULL", tüm satırlara uygulanmayı temsil eder. – A5C1D2H2I1M1N2O1R2T1

25
  1. Sen := (yani sen dt.out2 <- gerekmez) ile referans olarak atarsanız bütün data.table atamak gerekmez.

  2. := numaralı LHS'yi parantez içinde sarmanız ve değerlendirildiğinden (ve ad olarak kullanılmadığından) emin olmanız gerekir. Bunun gibi

: Roland'ın cevabı daha deyimsel iken

dt[, (strTmp) := lapply(.SD, as.numeric), .SDcols = strTmp] 
str(dt) 
#Classes ‘data.table’ and 'data.frame': 10 obs. of 4 variables: 
# $ A: chr "A" "B" "C" "D" ... 
# $ B: chr "a" "b" "c" "d" ... 
# $ C: num 0.30204 0.00269 0.46774 0.08641 0.02011 ... 
# $ D: num 0.151 0.0216 0.5689 0.3536 0.26 ... 
# - attr(*, ".internal.selfref")=<externalptr> 
+0

Çok teşekkür ederim! – Lafayette

+0

Bu 'en iyi cevap' olarak kabul edilmelidir imo – rolyat

İlgili konular