r - 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 解决方案!
解决方案
我们可以从这里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]
推荐阅读
- css - 在 React-Boostrap 中使用容器时,我的身体的背景颜色被覆盖
- wcf - WCF 流响应返回垃圾字符
- c# - 从 Blazor 组件读取数据
- python - 如果我在打印后添加冒号,为什么解释器不会抛出错误?
- protocol-buffers - sigsegv 在原始消息上使用 MessageDifferencer
- ios - 由于编译器抛出“关联类型的模糊推断”,因此无法在 swift 中将关联类型用作方法 returnType
- javascript - 使用同一表单中选择列表的结果填充表单中的一个字段
- perl - 如何从 Perl 中的哈希中获取最小值键
- asp.net-mvc - (ASP.NET MVC) JSON 响应包装,打印未处理的异常 - PageSpeed API 请求
- apache - 用于 HTTPS 到 HTTP 的 Apache 反向代理