2012-05-20 28 views
17

data.table ile küçük bir R sorunu ile sıkışmış. Yardımınız çok takdir ediliyor.R data.table içinde, değişken parametreleri bir ifadeye nasıl geçiririm?

ben yapamam bu yüzden şimdi, hem v1 ve v2 karakter değişken olarak diğer programdan geçmiş olsun

Error in sum(v1, na.rm = TRUE) : invalid 'type' (character) of argument

bu v1<- quote(Sepal.Length) görünüyor:

getResult <- function(dt, expr, gby) { 
    e <- substitute(expr) 
    b <- substitute(gby) 
    return(dt[,eval(e),by=b]) 
} 

v1 <- "Sepal.Length" 
v2 <- "Species" 

dt <- data.table(iris) 
rDT <- getResult(dt, sum(v1, na.rm=TRUE), v2) 

ben hata aşağıdaki almak: Bunu nasıl iş. yorumlarda

+9

Bu, sizi doğru yola koyabilir: 'dt [, sum (get (v1), na.rm = TRUE), by = v2]' veya esnek iseniz alternatif bir yaklaşım önerirsiniz. – flodel

+0

Thx. Ne oldu, ne oldu? İşlev, v1 adlı nesneyi alır. Bu ifade yerine ikame işlevi ne yaptı? Hiçbir şey yapmadı ve "Sepal.Length" karakter değeri ile v1 değiştirmeye çalıştı mı? – user1157129

cevap

20

alternatif flodel için cevabı olabilir

e <- parse(text = paste0("sum(", v1, ", na.rm = TRUE)")) 

b <- parse(text = v2) 

rDT2 <- dt[, eval(e), by = eval(b)] 

#    b V1 
# [1,]  setosa 250.3 
# [2,] versicolor 296.8 
# [3,] virginica 329.4 

DÜZENLEME:

Ve bir işlevi içine bu koymak için, Matthew dan

getResult <- function(dt, expr, gby){ 
    return(dt[, eval(expr), by = eval(gby)]) 
} 

(dtR <- getResult(dt = dt, expr = e, gby = b)) 
# gives the same result as above 


DÜZENLEME : quote yöntemlerle \ paste0 ve eval da bazı durumlarda get daha hızlı olabilir neden ince bir sebebi var. Gruplamanın neden olabileceği nedenlerden biri, data.table'un hangi sütunları kullandığını görmesi için olduğunu denetlemesidir, daha sonra yalnızca kullanılan sütunları (SSS 1.12 ve 3.1) alt kümelere ayırır. Bunu yapmak için base::all.vars(j) kullanır. j yılında get() kullanırken all.vars ve data.table gizlenmiştir kullanılan kolon geri (bunlar için .SDcols çözmek eklendi, çok .SD sembol j kullanıldığında gibi) her ihtimale j ifadesi onlara ihtiyacı tüm sütunları subsetting düşer . tüm sütunlar zaten kullanılırsa o zaman bir fark yaratmak, ancak DT eğer 1e7x100 sonra gruplandırılmış j=sum(V1) bu nedenle bir gruplandırılmış j=sum(get("V1")) çok daha hızlı olmalıdır demek olduğunu gelmez. En azından, gerçekleşmesi gereken şey bu, ve eğer değilse, o zaman bir hata olabilir. Öte yandan, birçok sorgu dinamik olarak oluşturulup tekrarlanırsa, o zaman paste0 ve parse zamanlarına gelebilir. Her şey gerçekten bağlı. verbose=TRUE ayarı, j tarafından kullanıldığı gibi hangi sütunların algılandığına dair bir mesaj yazdırmalıdır, böylece kontrol edilebilir.

+0

Teşekkürler, özgün soruya geri dönersek, bunu nasıl uygularız? GetResult <- function (dt, expr, gby) { print (dt [, eval (expr), by = eval (b)]) } v1 <- "Sepal.Length" v2 <- "Türler" e <- ayrıştırma (text = paste ("sum (", v1, ", na.rm = TRUE)")) b <- ayrıştırma (text = v2) # rDT2 <- dt [, eval (e), by = değerlendirme (b)] dtR <- getResult (dt, e, b) – user1157129

+0

@ user1157129, İstenen işlevin kullanılmaması için özür dilerim senin sorun. Lütfen öneri için düzenlemeye bakın. – BenBarnes

+0

Üzgünüm Ben, işe yaramıyor mu, bir şey mi yapıyordum? getResult <- function (dt, expr, gby) { return (dt [, eval (expr), tarafından = eval (gby)]) } dt <- veri.tablo (iris) v1 <- "Sepal.Length" v2 <- "Türler" e <- ayrıştırma (text = paste ("sum (", v1, ", na.rm = TRUE)")) b <- ayrıştırma (text = v2) dtR <- getResult (dt = dt, expr = e, gby = b) – user1157129

İlgili konular