data=data.frame("StudentID"=c(1,1,1,1,1,2,2,2,2,2,3,3,3,3,3,4,4,4,4,4),
"Time"=c(1,2,3,4,5,1,2,3,4,5,1,2,3,4,5,1,2,3,4,5),
"Group"=c(1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0),
"Class"=c(1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1),
"Test"=c(NA,1,0,NA,1,1,1,1,0,0,1,0,1,0,1,1,1,0,0,0),
"Score"=c(0,1,1,0,1,NA,0,1,NA,0,NA,1,1,1,1,0,0,1,1,1),
"P"=c(NA,3,1,1,1,1,2,NA,3,1,3,3,2,2,2,NA,NA,1,2,2))
Group-Pはカテゴリです。
data1:テスト、スコア、およびPのモードをグループおよびクラスごとに個別に計算してから、時間= 1のみのモードを代入したいと思います。
data2:別のステップとしてdata2を作成したいと思います。data2はdata1を取得し、T> 1である時間Tで欠落している値については、変数TestおよびScoreの各グループについて上記の値をコピーします。
data.tableソリューションに到達することを期待して!
ここMode
から機能を利用できます
Mode <- function(x) {
ux <- unique(x)
ux[which.max(tabulate(match(x, ux)))]
}
次に、対象の列をループして、「モード」を「グループ」replace
ごとに計算します。「モード」NA
と「時間」は1です。
library(data.table)
nm1 <- c("Test", "Score", "P")
setDT(data)[ , (nm1) := lapply(.SD, function(x)
replace(x, is.na(x) & Time == 1, Mode(x))), by = .(Group), .SDcols = nm1]
2番目のケースでは、
library(zoo)
nm2 <- c("Test", "Score")
data[Time > 1, (nm2) := lapply(.SD, na.locf0), .SDcols = nm2, by = Group]
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加