5

我有一个数据框mytable,其中包含对一组人进行的两次测量 A 和 B 的结果。

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)

虽然它有效,但我想知道如何在不弄乱原始表格的情况下做到这一点。此外,该解决方案对于计算差异非常具体。有什么更通用的方法可以实现相同的目标?

4

3 回答 3

6

我会使用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)).

于 2013-06-19T02:19:49.077 回答
4

在基地你可以这样做:

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
于 2013-06-19T02:31:22.953 回答
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
于 2013-06-19T05:24:24.433 回答