4

私は、参加者が 4 つの調査に自発的に回答するよう求められた縦断調査からの回答を集計しています。各参加者には固有の PartID があります。各参加者には SectionID (文字) が割り当てられます。試行されて完了した調査は、StatusID="Complete" で示されます。試行されたが完了していない調査は、StatusID="Incomplete" で示されます。調査を試みなかった参加者には記録がありませんが、結果の集計ではその調査の「0」としてカウントされます。

入力データの例:

    PartID SectionID     Status SurveyID
 1:    100         A   Complete        1
 2:    100         A   Complete        2
 3:    100         A   Complete        3
 4:    100         A   Complete        4
 5:    101         B Incomplete        1
 6:    101         B   Complete        2
 7:    101         B   Complete        3
 8:    101         B   Complete        4
 9:    102         A Incomplete        1
10:    103         B Incomplete        4
11:    104         B Incomplete        2
12:    105         A   Complete        1
13:    105         A   Complete        1
14:    105         A   Complete        3

次のコードは機能しますが、非常にずさんです。このデータ変更を達成するために data.table を使用する、よりクリーンでエレガントな方法があると思いますか? 特に、一時変数と、2 つの data.tables をマージする必要は避けたいと思います。

library(data.table)
DT <- fread ("PartID,SectionID,Status,SurveyID
100,A,Complete,1
100,A,Complete,2
100,A,Complete,3
100,A,Complete,4
101,B,Incomplete,1
101,B,Complete,2
101,B,Complete,3
101,B,Complete,4
102,A,Incomplete,1
103,B,Incomplete,4
104,B,Incomplete,2
105,A,Complete,1
105,A,Complete,1
105,A,Complete,3\n")

setkey(DT, PartID)

DT2<-DT
setkey(DT2,PartID, SectionID)
DT2<-DT2[Status=="Complete",.(c1=sum(SurveyID==1),c2=sum(SurveyID==2),c3=sum(SurveyID==3), c4=sum(SurveyID==4)), by=.(PartID,SectionID)]
DT3<-DT
setkey(DT3,PartID, SectionID)
DT3<-DT3[Status=="Incomplete",.(i1=sum(SurveyID==1),i2=sum(SurveyID==2),i3=sum(SurveyID==3), i4=sum(SurveyID==4)), by=.(PartID,SectionID)]
DT4<-merge(DT2,DT3, all=TRUE )
DT4[is.na(DT4)] <- 0
DT4

上記のコードによって得られる出力は正しく、次のとおりです (注: c1 は調査 #1 が完了したことを意味し、i1 は調査 #1 が未完了であることを意味します。また、参加者は調査ごとに複数の回答を送信する場合があることに注意してください)。

   PartID SectionID c1 c2 c3 c4 i1 i2 i3 i4
1:    100         A  1  1  1  1  0  0  0  0
2:    101         B  0  1  1  1  1  0  0  0
3:    102         A  0  0  0  0  1  0  0  0
4:    103         B  0  0  0  0  0  0  0  1
5:    104         B  0  0  0  0  0  1  0  0
6:    105         A  2  0  1  0  0  0  0  0
4

2 に答える 2

3

DT-Table を変更しない別の解決策は次のとおりです。

dt2 <- DT[,.(.N), by=.(PartID,SectionID, SurveyID, Status)]
dcast.data.table(dt2,PartID + SectionID ~ Status + SurveyID, value.var='N', sum)

その結果

   PartID SectionID Complete_1 Complete_2 Complete_3 Complete_4 Incomplete_1 Incomplete_2 Incomplete_4
1:    100         A          1          1          1          1            0            0            0
2:    101         B          0          1          1          1            1            0            0
3:    102         A          0          0          0          0            1            0            0
4:    103         B          0          0          0          0            0            0            1
5:    104         B          0          0          0          0            0            1            0
6:    105         A          2          0          1          0            0            0            0

akrun のソリューションは、必要に応じて列の名前を変更する方法も示しています。

于 2015-04-18T14:53:03.063 に答える