优雅的方式确定时间点之间的最后一次观察?

问题描述:

开始,这里的一些示例数据称为DF1:优雅的方式确定时间点之间的最后一次观察?

ID Time  Score1 Score2 SumScore 
1 Baseline 1  2  3 
1 Midpoint 2  2  4 
1 Final  3  2  5 
2 Baseline 2  2  4 
2 Midpoint 5  2  7 
2 Final  6  2  8 

我现在应该是一些在这些数据中我的“最后”的时间点得分的缺失不在话下。我只对那些缺少最终时间点的观察感兴趣。我们选择这些意见的调用新的DF DF2:df2<-df1%>%filter(is.na(SumScore)==T,Time=="Final")

从这里,我用tidyr::spread()创建一个新的数据帧(DF3)传播的数据,看起来像这样:

df3<-spread(df,ID,SumScore) 

ID Baseline Midpoint 
1 3  NA  
1 NA  4   
1 NA  NA  
2 4  NA  
2 NA  7   
2 NA  NA   

我想要完成的是确定最后一次观察(在基线和中点时间点之间),然后对df1中缺少最终时间点得分的观测进行观测。对于一些观察来说,也可能缺少中点分数。

感谢

+0

请附上您的问题玩具比如你所需的输出。 – lmo

+0

'do.call(rbind,lapply(split(df1,df1 $ ID),function(a)a [NROW(a),]))' –

+1

@ d.b这看起来确实很好。谢谢。 – lecreprays

使用dplyrtidyr,这样的事情可能是你在找什么...

df4 <- df1 %>% select(-c(Score1,Score2)) %>% 
       spread(key=Time,value=SumScore) %>% 
       mutate(finalScore=coalesce(Final,Midpoint,Baseline)) 


df4 
    ID Baseline Final Midpoint finalScore 
1 1  3  5  4   5 
2 2  4  8  7   8