2013-06-19 64 views
5

我有一個數據框mytable與兩個測量結果A和B,採取一組人。R:如何根據因子的水平計算差異?

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 

我要計算每個人的得分爲A和B這之間的區別,我想獲得:

person outcome_diff 
1  -0.3 
2  -0.9 
3  1.5 

我尋找一個答案,但我只發現了一些涉及一個因素水平內的轉化,而不是跨越它們。

我終於做去解決它:

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

雖然它的作品,我不知道怎麼做纔不至於搞亂了原始表。而且,這個解決方案對於計算差異非常具體。什麼可能是更一般的方式來實現相同的事情?

回答

5

我會用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 

下,你總是有整整兩個措施AB並按照這個順序,你可能也只是做ddply(mytable, "person", summarize, outcome_diff = -diff(outcome))的假設。

+0

的感謝!我會看看'plyr'。至於'diff'選項,我不太確定我是否理解它:由於「結果」長度爲6,「差異(結果)」應該長度爲5.因此,爲了獲得所需的'outcome_diff',選擇'diff(結果)'的奇怪元素,對吧? – DvD

3

在基地,你可以這樣做:

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解決方案:

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