2009-10-30 18 views
18

Buna benzeyen bir liste listemiz var: x[[state]][[year]]. Bunun her bir öğesi bir veri çerçevesidir ve bunlara bireysel olarak erişilmesi bir sorun değildir. Ancak, birden çok liste arasında veri çerçevelerini rindleştirmek istiyorum. Daha spesifik olarak, yıllardır sahip olduğum gibi birçok veri çerçevesinin çıktısını almak istiyorum, bu da her yıl içindeki tüm devlet veri karelerini hesaba katıyor. Diğer bir deyişle, tüm devlet verilerimi yıldan yıla ayrı veri karelerine birleştirmek istiyorum.listelerin bir listesindeki rbind dataframes listesi

Tek bir listeyi do.call("rbind",list) ile bir veri çerçevesine birleştirebileceğimi biliyorum. Ama listelerin listelerinde bunu nasıl yapabilirim bilmiyorum.

extract.year <- function(my.year) lapply(x, function(y) y[[my.year]]) 

x.by.year <- sapply(my.list.of.years, function(my.year) 
    do.call(rbind, extract.year(my.year))) 

fonksiyon özü yıl verilen yıl için sadece dataframes içeren bir liste oluşturur:

+2

, neden verilerle bu şekilde ilgileniyor yerine sadece tüm verilerle bir büyük veri çerçevesini sahip? –

cevap

6

Aşağıdaki satırlar boyunca bir şey (Ben böyle bir yapıya sahip olarak ben deneyemedim) yapabilirsiniz. Sonra onları rbind ... Önce bir liste halinde

+2

İşler yukarıdaki cevapla karmaşıklaşıyordu, bu yüzden çalıştığınız yaklaşımı denedim! Küçük bir değişiklikle. İlk satır aradığım veriyi döndürdü. İkinci satır işe yaramadı, bunun yerine Hadley'nin plyr paketine döndüm. Bu komut, ilk satırınızdan sonra rbinded veri karelerinin bir listesini döndürür: llply (my.list.of.years, function (my.year) do.call (rbind, ayık.year (my.year))) Harika, teşekkürler çocuklar yardım için! – bshor

+1

ldply() daha hızlı ve daha verimli! – bshor

32

Collapse it: meraktan

list <- unlist(listoflists, recursive = FALSE) 
df <- do.call("rbind", list) 
+0

Yardım istendiğin için teşekkürler! Ama bu tam olarak istediğim şey değil. Cevabınız bana liste listesindeki tüm veri çerçevelerinin tek bir veri çerçevesini verir (liste dışı, hiç bilmediğim bir komut). Ama tüm eyaletleri bir araya getirdiğim kadar uzun yıllar olan 32 rbind'ed veri karelerinin bir listesini istiyorum. Yanıtlarınızın ilk satırı bana yaklaşık bir eyalet * yıl uzunluk listesi getiriyor (bazı nedenlerden dolayı uzunluk = 1584, beklediğim gibi 32 * 50 = 1600 değil). Bence bu bir ipucu ... – bshor

+0

Daha fazla deneyden sonra, bir yere gidiyorum sanırım. İlk kez devlet listesinin öğelerini seçtim, böylece liste dışı listenin (Hadley ilk komutundan sonra) öğeleri artık "AL3" ve "TX4" gibi kullanışlı isimlere sahip. Şimdi bütün 3'leri bir araya getirmeliyim, 4'lerin hepsi, vb. – bshor

+0

Oğlum, sanırım normal ifadeler cevabın bir parçası. "1" ile isimlendirilen listeleri almak için grep'i ("1 $", names (list)) denedim ama bu bana 1, 1, 11, 21, 31 gibi bir yılla sahip oluyor. Grep'i denedim. "\ D1 $", isimler (liste)) ama hayır. – bshor