2013-02-15 21 views
5

'daki bir liste sütunu tarafından nasıl anahtarlanabilir? this post'dan sonra, data.table'daki listelerin sütunlarıyla ilgili başka bir sorum var.data.table

DT = data.table(x=list(c(1,2),c(1,2),c(3,4,5))) 

Bu, bir liste sütununda anahtar olamaz.

DT[,y:=.I,by=x] 
Erreur dans `[.data.table`(DT, , `:=`(y, .I), by = x) : 
    The items in the 'by' or 'keyby' list are length (2,2,3). Each must be same length as rows in x or number of rows returned by i (3). 

ben de aynı uzunlukta listeleri ile olabilir ama düşündüm:

DT = data.table(x=list(c(1,2),c(1,2),c(3,5))) 
DT[,y:=.I,by=x] 
Erreur dans `[.data.table`(DT, , `:=`(y, .I), by = x) : 
    The items in the 'by' or 'keyby' list are length (2,2,2). Each must be same length as rows in x or number of rows returned by i (3). 

Bir çözüm var mı? Bir özellik isteği hakkında ne varsa?

+0

evet 'list 'anahtar sütun olarak (şu anda) izin verilmez. Bu mesajı "setkey" (DT, "x") – Arun

cevap

3

Ben geçici bir çözüm olarak böyle bir şey yapacağını:

DT[, y := which(DT$x %in% x), by = 1:nrow(DT)] 

Bu grup kimliği olarak görev yapacak her zaman ilk eşleşen endeksi döndürür.

Böyle bir şey yapmalıdır:

DT[, psnInGrp := seq_along(x), by=y] 

#  x y psnInGrp 
# 1: 1,2 1  1 
# 2: 1,2 1  2 
# 3: 3,4,5 3  1 
+1

Doh ... kahve zamanı için yaptığınızda alırsınız. – statquant

+0

Genel olarak 'by = 1: nrow (DT)' hakkında emin değilsiniz. 'J''de' lapply' ve arkadaşlarını kullanmak daha hızlı olabilir. –

+0

@MatthewDowle, '1: nrow (DT)' yapmadan satır satır satır seçmek mümkün mü? – Arun

İlgili konular