1

縦断的なデータセットscore内で最高のものを特定しようとしています。ID

私のデータがこのように見えるとしましょう。

dfL <- data.frame(ID = c(1L, 1L, 1L, 4L, 4L, 4L, 4L, 4L, 9L, 9L, 9L, 9L, 9L, 10L), week = c("baseline", 4L, 6L, "baseline", 6L, 9L, 9L, 12L, "baseline", 4L, 6L, 9L, 12L, "baseline"), score = c(NA, "A", "B", NA, "B", "E", "D", "C", NA, "B", "A", "A", "B", NA)); dfL
   ID     week score
1   1 baseline  <NA>
2   1        4     A
3   1        6     B
4   4 baseline  <NA>
5   4        6     B
6   4        9     E
7   4        9     D
8   4       12     C
9   9 baseline  <NA>
10  9        4     B
11  9        6     A
12  9        9     A
13  9       12     B
14 10 baseline  <NA>

私がやろうとしているのは、文字で表された最高スコアを見つけ、B を無視し、この文字をbaselinefor eachに配置することIDです。設計結果は次のようになります。

dfL$hi_score <- c("A", NA, NA, "E", NA, NA, NA, NA, "A", NA, NA, NA, NA, NA);dfL
   ID     week score hi_score
1   1 baseline  <NA>        A
2   1        4     A     <NA>
3   1        6     B     <NA>
4   4 baseline  <NA>        E
5   4        6     B     <NA>
6   4        9     E     <NA>
7   4        9     D     <NA>
8   4       12     C     <NA>
9   9 baseline  <NA>        A
10  9        4     B     <NA>
11  9        6     A     <NA>
12  9        9     A     <NA>
13  9       12     B     <NA>
14 10 baseline  <NA>     <NA>

これを解決する方法を知っている人のために、経時データの操作方法を学習するための優れたチュートリアルがある書籍または Web ページをお勧めできますか?

4

2 に答える 2

2

これが簡単な解決策です。

dfL <- data.frame(ID = c(1L, 1L, 1L, 4L, 4L, 4L, 4L, 4L, 9L, 9L, 9L, 9L, 9L, 10L), week = c("baseline", 4L, 6L, "baseline", 6L, 9L, 9L, 12L, "baseline", 4L, 6L, 9L, 12L, "baseline"), score = c(NA, "A", "B", NA, "B", "E", "D", "C", NA, "B", "A", "A", "B", NA));

#find the highest score per id excluding "B"
highestScore = by(dfL$score, dfL$ID, function(ids){ 
    head(rev(sort(ids[ids != "B"])), 1) 
})

dfL$hi_score = NA
for (id in names(highestScore)){
    newWeek = as.character(highestScore[[id]])
    #to account for weeks with no scores
    newWeek = ifelse(length(newWeek)==0, NA, newWeek)
    #only update the hi scores at the baseline position  
    dfL[which(dfL$ID == id & dfL$week == "baseline"), "hi_score"] = newWeek
}

dfL

チュートリアルに関しては、練習がすべてです。このサイトの質問と回答を読むことは、すばらしい出発点です。

于 2013-03-29T20:51:28.223 に答える
1

これでうまくいくと思います。

dfL <- data.frame(ID = c(1L, 1L, 1L, 4L, 4L, 4L, 4L, 4L, 9L, 9L, 9L, 9L, 9L, 10L), week = c("baseline", 4L, 6L, "baseline", 6L, 9L, 9L, 12L, "baseline", 4L, 6L, 9L, 12L, "baseline"), score = c(NA, "A", "B", NA, "B", "E", "D", "C", NA, "B", "A", "A", "B", NA)); dfL
library(plyr)

dfL$score <- as.character(dfL$score)
dfL$score <- ifelse(dfL$score!="B",dfL$score,NA)
maxdat <- ddply(dfL,.(ID),summarise,hi_score=max(score,na.rm=TRUE))
finaldat <- merge(dfL, maxdat, by="ID")  

そして、ベースラインの週とは異なる行の欠落が本当に必要な場合は、次のことができます。

finaldat$hi_score<- ifelse(finaldat$week=="baseline", finaldat$hi_score,NA)

データ変換について詳しく知りたい場合は、reshape2 http://had.co.nz/reshape/plyr http://plyr.had.co.nz/などの Hadley のパッケージを確認してください。

于 2013-03-29T20:42:02.123 に答える