Я хотел бы рассчитать надежное улучшение или ухудшение с 1-го от 1-го до «последнего сеанса» в несбалансированном наборе данных, организованном в длинном формате.Рассчитать надежное улучшение до публикации оценки из несбалансированных данных в длинном формате
Данные у меня есть выглядит следующим образом:
ID <- c("A","A","B","B","B","C","C","C","C")
Session <-c(1,2,1,2,3,1,2,3,4)
Value <- c(10,6,25,35,15,20,25,35,35)
Have <- data.table(ID,Session,Value)
Have
ID Session Value
A 1 10
A 2 6
B 1 25
B 2 35
B 3 15
C 1 20
C 2 25
C 3 35
C 4 35
данные мне нужно будет выглядеть следующим образом:
Change <- c(-4,-4,-10,-10,-10,15,15,15,15)
Need <- data.table(ID,Session, Value,Change)
Need
ID Session Value Change
A 1 10 -4
A 2 6 -4
B 1 25 -10
B 2 35 -10
B 3 15 -10
C 1 20 15
C 2 25 15
C 3 35 15
C 4 35 15
Я попытался это:
Have$change<-as.vector(unlist(tapply(Have$Value,Have$ID,FUN=function(x){return (x-rep(x[1],length(x)))})));
Have
ID Session Value change
A 1 10 0
A 2 6 -4
B 1 25 0
B 2 35 10
B 3 15 -10
C 1 20 0
C 2 25 5
C 3 35 15
C 4 35 15
Я использовал код от этого поста Calculating change from baseline with data in long format
Привет спасибо за ответ! Код работает отлично в приведенном выше примере. Я пробовал это на моем исходном наборе данных, но он возвращает «Ошибка: ожидая единственное значение» ... Исходные данные - это data.frame, как в примере. Я изменил переменную ID в своем наборе данных от фактора к символу (как в примере), но я все еще получаю ошибку. Идентификационная переменная выглядит, например, как «BNCS01», сеанс является числовым (то же самое в примере, но варьируется от 1 до 29), а значение - числовым диапазоном от 0 до 40 (с 3 десятичными знаками). Любые предложения о том, почему я получаю сообщение об ошибке? – Carl
Привет @Carl, я бы предположил, что эта проблема в том, что у одной из ваших групп только 1 наблюдение. Я не принимал во внимание, что если только 1 наблюдение передается 'diff', он возвращает вектор длины 0, где dplyr ожидает вектор длины 1. Чтобы решить эту проблему, вы можете просто написать и использовать свою собственную функцию diff, это также дает дополнительное преимущество, давая вам больше контроля над тем, как обрабатывать отдаленные или отсутствующие значения. Например, вы можете использовать следующую 'DIFF <- function (x) { ### Удалить NAs x <- x [! Is.na (x)] if (length (x) == 0) return (NA) else return (max (x) - min (x)) } ' – CroGo