2013-06-19 23 views
5

Mam ramkę danych mytable z wynikami dwóch pomiarów, A i B, wykonanych na grupie osób.R: jak obliczyć różnice na podstawie poziomów czynników?

person measure outcome 
1  A  3.6 
2  A  2.3 
3  A  4.2 
1  B  3.9 
2  B  3.2 
3  B  2.7 

Chcę obliczyć dla każdej osoby różnicę między wynikami dla A i B. To znaczy, chcę otrzymać:

person outcome_diff 
1  -0.3 
2  -0.9 
3  1.5 

Szukałem na odpowiedź, ale tylko znaleźć jakiś dotyczące przekształceń w obrębie poziomu czynnika, a nie w poprzek.

końcu udało mi się dogadać, wykonując:

mytable$outcome[mytable$measure=="B"] <- -1*mytable$outcome[mytable$measure=="B"] 
outtable <- aggregate(outcome ~ person, data=mytable, FUN=sum) 

Chociaż to działa, zastanawiam się, jak to zrobić bez brudząc się oryginalną tablicę. Ponadto to rozwiązanie jest dość specyficzne do obliczania różnicy. Jaki może być bardziej ogólny sposób osiągnięcia tego samego?

Odpowiedz

5

użyłbym plyr:

ddply(mytable, "person", summarize, 
     outcome_diff = outcome[measure == "A"] - 
        outcome[measure == "B"]) 
# person outcome_diff 
# 1  1   -0.3 
# 2  2   -0.9 
# 3  3   1.5 

Przy założeniu, że zawsze mają dokładnie dwa środki A i B i w tej kolejności, możesz też po prostu zrobić ddply(mytable, "person", summarize, outcome_diff = -diff(outcome)).

+0

dzięki! Przyjrzę się 'plyr'. Jeśli chodzi o alternatywę 'diff', to nie jestem pewien, czy ją rozumiem: ponieważ' result' ma długość 6, 'diff (wynik)' powinno mieć długość 5. Tak więc, aby uzyskać pożądany parametr 'result_diff', należy wybierz dziwne elementy 'diff (result)', prawda? – DvD

3

W bazie można to zrobić:

ans <- sapply(split(myTable, myTable$person), function(x) { 
    diff(x[order(x$measure), 3]) 
}) 

data.frame(person = names(ans), outcome_dif = ans) 

## person outcome_dif 
## 1  1   0.3 
## 2  2   0.9 
## 3  3  -1.5 
3

data.table rozwiązanie:

library(data.table) 
DT <- as.data.table(dat) 
DT[ , list(outcome_diff = outcome[measure == "A"] - 
       outcome[measure == "B"]),person] 
# person outcome_diff 
# 1:  1   -0.3 
# 2:  2   -0.9 
# 3:  3   1.5 
Powiązane problemy