2013-06-19 8 views
5

Ich habe einen Datenrahmen mytable mit Ergebnissen für zwei Messungen, A und B, zu einer Gruppe von Personen genommen.R: Wie berechnet man Differenzen basierend auf den Ebenen eines Faktors?

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 

ich für jede Person, die die Differenz zwischen den Werten für A und B berechnen wollen Das heißt, möchte ich erhalten:

person outcome_diff 
1  -0.3 
2  -0.9 
3  1.5 

ich nach einer Antwort gesucht, aber ich fand nur einige über Transformationen innerhalb der Ebenen eines Faktors, nicht über sie hinweg.

ich es endlich geschafft, es durch zu tun zu arbeiten:

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

Obwohl es funktioniert, ich frage mich, wie es zu tun, ohne die Original-Tabelle durcheinander. Darüber hinaus ist diese Lösung sehr spezifisch zum Berechnen eines Unterschieds. Was könnte ein allgemeinerer Weg sein, um dasselbe zu erreichen?

Antwort

5

würde ich plyr verwenden:

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 

Unter der Annahme, dass Sie immer genau zwei Maßnahmen A und B und in dieser Reihenfolge, können Sie auch tun, nur ddply(mytable, "person", summarize, outcome_diff = -diff(outcome)).

+0

Dank! Ich schaue mir 'plyr' an. Was die 'diff'-Alternative betrifft, bin ich mir nicht wirklich sicher, ob ich es verstehe: da 'outcome' Länge 6 hat, sollte' diff (outcome) 'Länge 5 haben. Um also das gewünschte' outcome_diff 'zu erhalten, sollte man zusätzlich Wähle die ungeraden Elemente von 'diff (outcome)', oder? – DvD

3

In Basis könnten Sie dies tun:

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

A data.table Lösung:

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 
Verwandte Themen