2016-06-30 7 views
0

長い形式のアンバランスなデータセットで、セッション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変数を因子から文字に変更しましたが(例のように)、まだエラーが発生します。 ID変数は「BNCS01」、Sessionは数値(例では1〜29の範囲で同じです)、Valueは0〜40の数値範囲(小数点以下3桁)です。なぜ私はエラーメッセージが表示されるのですか? – Carl

+0

こんにちは@Carl、私はこの問題はあなたのグループの1つだけがそこに1つの観測を持っていると思います。私は考慮しませんでしたが、1つの観測が 'diff'に渡された場合、dplyrが長さ1のベクトルを期待している長さ0のベクトルを返します。これを解決するには、独自のdiff関数外れ値や欠損値の処理方法をより詳細に制御できるという利点があります。たとえば、次のような 'DIFF < - function(x){ ### NAsの削除 x < - x [!is.na(x)] if(length(x)== 0)return(NA ) else return(max(x) - min(x)) } – CroGo

関連する問題