2012-05-06 30 views
7

Właśnie wróciłem do R z długiej przerwy w pisaniu i mam poważne problemy z pamięcią, jak przekształcać dane. Wiem, że to, co chcę zrobić, jest łatwe, ale z jakiegoś powodu jestem dziś głupi i pomyliłem się z topnieniem i przekształceniem. Jeśli ktokolwiek mógłby szybko wskazać mi właściwy kierunek, byłoby to bardzo cenne.proste przekształcenie data.frame

Mam dataframe jako takie:

person week year 
personA 6  1 
personA 22  1 
personA 41  1 
personA 42  1 
personA 1  2 
personA 23  2 
personB 8  2 
personB 9  2 
.... 
personN x  y 

Chcę skończyć z liczbą zdarzeń według roku i przez osobę: (tak, że mogę wykreślić szybki wykres liniowy dla każdej osoby na terenie lat)

np.

person year1 year2 
personA 4  2 
personB 0  2 

Wielkie dzięki za przeczytanie.

Odpowiedz

8

Prawdopodobnie używać reshape2 pakiet i funkcję dcast ponieważ obsługuje zarówno dopasowania kształtu i agregacji w jednym kroku:

library(reshape2) 
> dcast(person ~ year, value.var = "year", data = dat) 
Aggregation function missing: defaulting to length 
    person 1 2 
1 personA 4 2 
2 personB 0 2 
+0

To jest wielki - użył Reshape wcześniej, ale nie reshape2 - wielkie dzięki. – user1378122

7

W tym przypadku można po prostu użyć tapply:

> with(data, tapply(week, list(person=person, year=year), length)) 
     year 
person  1 2 
    personA 4 2 
    personB NA 2 

Wynikiem jest macierz. Ten roztwór wytwarza NA, jeśli są puste komórki.

+0

Zastanawiam się, czy możliwe jest włączenie "NA" w tygodniu do tego rozwiązania ... Jednym ze sposobów jest zmiana "NA" w tygodniu na jakąś dziwną wartość, ale zastanawiałem się, czy jest poza rozwiązanie pudełkowe ... Jakieś myśli? –

5

xtabs z zasady R działa bardzo dobrze do tego problemu:

dat <- read.table(text="person week year 
personA 6  1 
personA 22  1 
personA 41  1 
personA 42  1 
personA 1  2 
personA 23  2 
personB 8  2 
personB 9  2 
", header=TRUE) 
xtabs(~person+year, data=dat) 
#----------------- 
     year 
person 1 2 
    personA 4 2 
    personB 0 2 

Można było przekazać swoje wyjście matplot ponieważ zwraca obiekt stołu/matrix

matplot(xtabs(~person+year, data=dat)) 

Sygnał wyjściowy oś x na tym małym przykładzie może nie być to, czego chcesz, ale z większą ilością lat może być bardziej zadowalająca domyślna etykieta osi. Albo można stłumić etykiety domyślna oś X z xaxt = „n” i używać axis do znakowania, jak chcesz:

matplot( xtabs(~person+year, data=dat), xaxt="n", type="b")