2012-09-14 13 views
11

Mam ramki danych o następującej strukturze:R: Split elementy listy w podlist

pat = c(rep(1, 50), rep(2, 50), rep(3, 50)) 
inc = rep(c(rep(1, 5), rep(2, 5), rep(3, 5), rep(4, 5), rep(5, 5), rep(6, 5), 
rep(7, 5), rep(8, 5), rep(9, 5), rep(10, 5)), 3) 
df = data.frame(cbind(pat, inc)) 

df jest podzielony na liście elementów:

all.inc = split(df, inc) 

Teraz chcę podzielić każdy element tej listy do podlist. Coś takiego:

all.pat = split(all.inc, pat) 

To oczywiście nie działa. Próbowałem już funkcji plyr i lapply, ale nie działało.

Wszelkie pomysły?

Odpowiedz

7

Zastosowanie lapply:

lapply(all.inc, function(x) split(x, x$pat)) 
+0

OK, działa. W rezultacie otrzymuję listę o tej samej długości (10) co all.inc. Ale chcę mieć każdy element na przykład, by wszystko.pat [1] było pojedynczym elementem listy. all.pat [1] ma długość 1, ale powinna mieć długość 3. W tym przypadku cała lista powinna mieć długość 30. Mam nadzieję, że to jasne ?! – Markus

+0

@Markus, to dlatego, że lista jest * zagnieżdżona *. Indeksowanie podlist wymaga: 'length (all.pat [[1]])'. – A5C1D2H2I1M1N2O1R2T1

+0

ok, nie ma problemu. Właśnie znalazłem funkcję "unlist". Przy rekursywnej opcji = F zapewnia oczekiwany wynik. Wielkie dzięki! – Markus

6

Jeśli chcesz podzielić ramkę danych naraz, można użyć

split(df, interaction(df$pat,df$inc)) 

jednak zwrócona wartość będzie jedna lista danych ramki, które nieznacznie różnią się od tego, co otrzymasz, dzieląc elementy listy.

+0

Jaka jest różnica między używaniem "interakcji" i "list" ("split (df, list (df $ ...)" tutaj? Rzeczywiście podoba mi się to lepiej niż to, co robi OP, ponieważ uważam, że radzenie sobie z listami zagnieżdżonymi może być czasami niewygodnym +1. – A5C1D2H2I1M1N2O1R2T1

+0

@mrdwab, widocznie nie ma różnicy (chyba że "identyczny" mnie okłamuje) 'split.default' wywołuje 'interakcję' na' f' jeśli 'f' jest listą, więc pomyślałem, że wycinam ten krok.Jeśli PO wykonuje obliczenia po pierwszym rozbiciu, a następnie rozdziela ponownie, to moje rozwiązanie nie pomoże. +1 do ciebie! – BenBarnes

+0

@ RomanLuštrik, sprawdziłem i to nie Tworzy również pojedynczą listę (w tym przypadku) 30 ramek danych, zastanawiałem się tylko, czy jedna metoda jest bardziej zalecana niż druga - zawsze używałem podejścia 'list' . – A5C1D2H2I1M1N2O1R2T1