Условная разница между двумя столбцами data.frame - PullRequest
0 голосов
/ 14 сентября 2018

У меня есть аккуратный data.frame экспериментальных данных с субъектами ID, которые были измерены три раза (Trial) в различное (!) Количество временных точек (Session) в двух разных условиях (Direction) для зависимой непрерывной переменной, скажем LC:

set.seed(5)
nSubjects <- 4
nDirections <- 2
nTrials <- 3
# Between 1 and 3 sessions per subject:
nSessions <- round(runif(nSubjects,
                         min = 1, max = 3))
mydat <- data.frame(ID = do.call(rep, args = list(1:nSubjects,
                                                  times = nSessions * nDirections * nTrials)),
                    Session = rep(sequence(nSessions),
                                  each = nDirections * nTrials),
                    Trial = rep(rep(1:nTrials,
                                    each = nDirections),
                                times = sum(nSessions)),
                    Direction = rep(c("up", "down"),
                                    times = nTrials * sum(nSessions)),
                    LC = 1:(nDirections * nTrials * sum(nSessions)))

Я хотел бы рассчитать вектор длины nrow(mydat), который содержит разницу в LC между первым и текущим сеансами данного субъекта и испытания и направления. Другими словами, из каждой (абсолютной) LC оценки любого идентификатора, сеанса, проб и направления (абсолютное) LC из сеанса == 1 того же идентификатора, проба и направление вычитается, как это (для ради простоты я выбрал LC, чтобы быть монотонно увеличивающимся):

#     ID Session Trial Direction LC LC_diff
#  7   2       1     1        up  7       0
#  8   2       1     2      down  8       0
#  9   2       1     3        up  9       0
# 10   2       1     1      down 10       0
# 11   2       1     2        up 11       0
# 12   2       1     3      down 12       0
# 13   2       2     1        up 13       6
# 14   2       2     2      down 14       6
# 15   2       2     3        up 15       6
# 16   2       2     1      down 16       6
# 17   2       2     2        up 17       6
# 18   2       2     3      down 18       6

Я думал, что следующий код даст желаемый результат:

library(dplyr)
ordered <- group_by(mydat, ID, Session, Trial, Direction)
mydat$LC_diff <- summarise(ordered,
                           Diff = sum(abs(LC[Trial != 1]),
                                      - abs(LC[Trial == 1])))$Diff

Но, увы:

mydat[7:18, ]

#    ID Session Trial Direction LC LC_diff
# 7   2       1     1        up  7      -8
# 8   2       1     2      down  8      -7
# 9   2       1     3        up  9      10
# 10  2       1     1      down 10       9
# 11  2       1     2        up 11      12
# 12  2       1     3      down 12      11
# 13  2       2     1        up 13     -14
# 14  2       2     2      down 14     -13
# 15  2       2     3        up 15      16
# 16  2       2     1      down 16      15
# 17  2       2     2        up 17      18
# 18  2       2     3      down 18      17

Я в полном недоумении и буду признателен за любые указания, где мой код неверен.

1 Ответ

0 голосов
/ 15 сентября 2018

Я не уверен, что это то, что вы имели в виду, но с data.table было бы так:

library(data.table)
setDT(mydat)[,new:= abs(LC)-abs(LC[1]),by=.(ID, Trial, Direction)]
mydat[ID==2,]
    ID Session Trial Direction LC new
 1:  2       1     1        up  7   0
 2:  2       1     1      down  8   0
 3:  2       1     2        up  9   0
 4:  2       1     2      down 10   0
 5:  2       1     3        up 11   0
 6:  2       1     3      down 12   0
 7:  2       2     1        up 13   6
 8:  2       2     1      down 14   6
 9:  2       2     2        up 15   6
10:  2       2     2      down 16   6
11:  2       2     3        up 17   6
12:  2       2     3      down 18   6
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...