我想计算从第1阶段到第34阶段的可靠改进或恶化;最后一次会议"在以长格式组织的不平衡数据集中。
我的数据如下:
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 :(得分: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")
编辑:稍微更新了我的代码以简化它