2015-07-15 20 views
8

Listede liste dışı liste sütunu. Tüm liste öğelerinin aynı tür olduğunu varsayarak. Liste elemanları isimlendirilir, isim de ele alınmalıdır.
Bir şekilde tersi işlem data.table aggregation to list column.
SO bilgi tabanına sahip olmaya değer olduğunu düşünüyorum.
Şu anki çözüm yaklaşımım aşağıda, biraz daha kanonik bir cevap arıyorum.Listede liste dışı liste sütunları data.table

library(data.table) 
dt <- data.table(
    a = letters[1:3], 
    l = list(list(c1=6L, c2=4L), list(x=2L, y=4L, z=3L), list()) 
) 
dt[] 
# a  l 
# 1: a <list> 
# 2: b <list> 
# 3: c <list> 
dt[,.(a = rep(a,length(l)), 
     nm = names(unlist(l)), 
     ul = unlist(l)), 
    .(id = seq_along(a)) 
    ][, id := NULL 
    ][] 
# a nm ul 
# 1: a c1 6 
# 2: a c2 4 
# 3: b x 2 
# 4: b y 4 
# 5: b z 3 
# 6: c NA NA 
+0

sadece 'dt' [., (nm = isimleri (listelenmemesini (l)), ul = listelenmemesini (l)), = a göre] yapamaz mı? –

+1

Boş bir listeye sahip olan son satır, bu şekilde ele alınmaz. – jangorecki

+0

@jangorecki, Boş listeler de her zaman adsız mı? – A5C1D2H2I1M1N2O1R2T1

cevap

8

Emin değilim daha "kurallı" ama burada bazı iyileştirmeler ile, sayesinde (listede verilerin türünü bilmek dikkate, bu nedenle by=a kullanabilirsiniz l değiştirmek için bir yoldur @DavidArenburg):

dt[lengths(l) == 0, l := NA_integer_][, .(nm = names(unlist(l)), ul = unlist(l)), by = a] 

# a nm ul 
#1: a c1 6 
#2: a c2 4 
#3: b x 2 
#4: b y 4 
#5: b z 3 
#6: c NA NA 
+0

'lengths' işlevi nereden geliyor? Oh, nm, görüyorum ki yeni R versiyonları var – eddi

+0

@eddi, tbh orijinal çizgisi 'lapply (l, uzunluk)' ile, 'lengths' kullanımı David Arenburg tarafından önerilen geliştirmelerin bir parçasıdır ;-) – Cath