2013-06-19 65 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