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

Я хочу, чтобы вычислить для каждого человека, разница между оценками для А и В. То есть, я хочу получить:

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 

В предположении, что у вас всегда есть ровно две меры A и B и в таком порядке, вы также можете просто сделать ddply(mytable, "person", summarize, outcome_diff = -diff(outcome)).

+0

спасибо! Я посмотрю на 'plyr'. Что касается альтернативы 'diff', я не уверен, что я ее понимаю: поскольку' result' имеет длину 6, 'diff (result)' должен иметь длину 5. Таким образом, чтобы получить желаемый 'result_diff', нужно дополнительно выберите нечетные элементы 'diff (result)', правильно? – 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 
Смежные вопросы