首页 > 解决方案 > R Data.Table模式按组插补第一条记录

问题描述

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:我希望按 Group 和 Class 分别计算 Test、Score 和 P 的众数,然后只计算 Time = 1 的众数。

data2:作为一个单独的步骤,我希望创建 data2;data2 获取 data1 并且对于 T > 1 的时间 T 的任何缺失值,为变量 Test 和 Score 复制上面的每个组的值。

希望达成 data.table 解决方案!

标签: rdata.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]

对于第二种情况,它将是

library(zoo)
nm2 <- c("Test", "Score")
data[Time  > 1,  (nm2) := lapply(.SD, na.locf0), .SDcols = nm2, by = Group]

推荐阅读