【问题标题】:R Data.Table Mode Imputation First Record By GroupR Data.Table模式按组插补第一条记录
【发布时间】:2020-03-18 22:27:11
【问题描述】:
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 解决方案!

【问题讨论】:

  • 我也更新了第二种情况。一开始我不知道你说的copy down是什么意思。

标签: r data.table


【解决方案1】:

我们可以使用here中的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]

【讨论】:

猜你喜欢
  • 2012-05-15
  • 1970-01-01
  • 2013-08-09
  • 2019-10-23
  • 1970-01-01
  • 1970-01-01
  • 2018-04-27
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多