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