2016-06-30 13 views
0

Я хотел бы рассчитать надежное улучшение или ухудшение с 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

ответ

0

Не самый красивый код, но он делает то, что вы хотите, я думаю. Я действительно не знаю data.table, поэтому вместо этого использовал dplyr. Я также получил немного помощи о том, как выбрать первый и последний из этого вопроса https://stackoverflow.com/a/31529043/4651564

library(dplyr) 

Have <- as.data.frame(Have) 

Have2 <- Have %>% 
    group_by(ID) %>% 
    arrange(Session) %>% 
    filter(row_number() %in% c(1 , n())) %>% 
    summarise(change = diff(Value) ) 


Have %>% left_join (Have2 , by = "ID") 

редактирования: Обновлен мой код немного упростить его

+0

Привет спасибо за ответ! Код работает отлично в приведенном выше примере. Я пробовал это на моем исходном наборе данных, но он возвращает «Ошибка: ожидая единственное значение» ... Исходные данные - это data.frame, как в примере. Я изменил переменную ID в своем наборе данных от фактора к символу (как в примере), но я все еще получаю ошибку. Идентификационная переменная выглядит, например, как «BNCS01», сеанс является числовым (то же самое в примере, но варьируется от 1 до 29), а значение - числовым диапазоном от 0 до 40 (с 3 десятичными знаками). Любые предложения о том, почему я получаю сообщение об ошибке? – Carl

+0

Привет @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