1

次のようなデータフレームがあります。

ID rd_test_2011 rd_score_2011 mt_test_2011 mt_score_2011 rd_test_2012 rd_score_2012 mt_test_2012 mt_score_2012
1  A            80            XX           100           NA           NA            BB           45 
2  XX           90            NA           NA            AA           80            XX           80

yy_test_20xx 列に NA がない ID について、列タイトルから取得した件名、テスト名、テスト スコア、および列タイトルから取得した年を含む新しいデータ フレームを作成するスクリプトを作成したいと考えています。 . したがって、この例では、ID 1 には 3 つのエントリがあります。予想される出力は次のようになります。

ID   Subject    Test        Score        Year
1    rd         A           80           2011
1    mt         XX          100          2012
1    mt         BB          45           2012
2    rd         XX          90           2011
2    rd         AA          80           2012
2    mt         XX          80           2012

私は reshape とさまざまな形式の merged.stack の両方を試しました。これは、正しい道を進んでいる出力を取得するという意味で機能しますが、そこに到達するのに十分なほど入力を理解できません。

library(splitstackshape)
merged.stack(x, id.vars='id', var.stubs=c("rd_test","mt_test"), sep="_")

私は reshape でより多くの成功を収めました (近づきました):

y<- reshape(x, idvar="id", ids=1:nrow(x), times=grep("test", names(x), value=TRUE), 
      timevar="year", varying=list(grep("test", names(x), value=TRUE), grep("score",
      names(x), value=TRUE)), direction="long", v.names=c("test", "score"),
      new.row.names=NULL) 
4

3 に答える 3

2

使用reshape:

 dat.long <- reshape(dat, direction="long",  varying=list(c(2, 4,6), c(3, 5,7)), 
                       times=2011:2013,timevar='Year',
                       sep="_", v.names=c("Test", "Score"))


dat.long[complete.cases(dat.long),]

      ID Year Test Score id
1.2011  1 2011    A    80  1
2.2011  2 2011   XX    90  2
4.2011  4 2011    A    50  4
5.2011  5 2011    C    50  5
1.2012  1 2012   XX   100  1
3.2012  3 2012    A    10  3
4.2012  4 2012   XX    60  4
5.2012  5 2012    A    75  5
2.2013  2 2013   AA    80  2
4.2013  4 2013   AA    99  4
于 2013-10-17T22:58:37.880 に答える
2

これにより、データが正しい形式になります。

df.long = reshape(df, idvar="ID", ids=1:nrow(df), times=grep("Test", names(df), value=TRUE),
 timevar="Year", varying=list(grep("Test", names(df), value=TRUE), 
grep("Score", names(df), value=TRUE)), direction="long", v.names=c("Test", "Score"),
new.row.names=NULL) 

次に省略NA

df.long = df.long[!is.na(df.long$Test),]

次に、分割Yearして削除しTest_ます:

df.long$Year = sapply(strsplit(df.long$Year, "_"), `[`, 2)

そして注文ID

df.long[order(df.long$ID),]

   ID Year Test Score
1   1 2011    A    80
5   1 2012   XX   100
2   2 2011   XX    90
9   2 2013   AA    80
6   3 2012    A    10
3   4 2011    A    50
7   4 2012   XX    60
10  4 2013   AA    99
4   5 2011    C    50
8   5 2012    A    75
于 2013-10-17T22:58:50.393 に答える