2013-06-19 14 views
5

Bir grup kişiye alınan A ve B gibi iki ölçüm için sonuçları olan mytable veri çerçevem ​​var.R: Faktör düzeylerine göre farklılıklar nasıl hesaplanır?

Ben her kişi için olduğu A ve B için puanları arasındaki farkı hesaplamak isteyen
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 

, ben elde etmek istiyorum:

person outcome_diff 
1  -0.3 
2  -0.9 
3  1.5 
Bir cevap arandı

, ama ben sadece bazılarını buldum Bir faktör seviyesindeki dönüşümler ile ilgili değil.

Sonunda yaparak çalışmak yönetilen:

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

çalıştığını rağmen, orijinal tabloyu bozmadan nasıl yapılacağını merak ediyorum. Ayrıca, bu çözüm bir farkı hesaplamak için oldukça spesifiktir. Aynı şeyi elde etmek için daha genel bir yol ne olabilir?

cevap

5

Ben plyr kullanırsınız:

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 

her zaman tam olarak iki önlem A ve B varsa ve bu sırayla, ayrıca sadece ddply(mytable, "person", summarize, outcome_diff = -diff(outcome)) yapabilecek varsayımı altında. Baz içinde

+0

teşekkürler! Plyr'e bir bakacağım. 'Diff' alternatifi gelince, ben gerçekten anladığımdan emin değilim: sonuçtan 6 tane olduğu için, "diff (sonuç)" 5 uzunluğuna sahip olmalıydı. Böylece istenen 'outcome_diff'i elde etmek için adli olarak diff (outcome) 'un tuhaf elemanlarını seçin, değil mi? – DvD

3

Bunu yapabilirdi:

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 çözüm:

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 
İlgili konular