首页 > 解决方案 > 按唯一 ID 填写组的缺失数据

问题描述

我的临床数据结构如下所示:

patientid <- c(100,100,100,101,101,101,102,102,102,104,104,104)
group <- c(1,1,NA,2,NA,NA,1,1,1,2,2,NA)

Data<- data.frame(patientid=patientid,group=group)

如果缺少数据,则 NA 应成为与同一患者 ID 的其他组值相同的值。换句话说,患者总是在同一组中,需要填写缺失的数据以反映这一点。所以它应该是这样的:

patientid <- c(100,100,100,101,101,101,102,102,102,104,104,104)
group <- c(1,1,1,2,2,2,1,1,1,2,2,2)

Data<- data.frame(patientid=patientid,group=group)

标签: rmissing-data

解决方案


您可以编写一个小辅助函数,例如:

fun <- function(x) replace(x, is.na(x), x[!is.na(x)][1])

然后,您可以在基础 R 中使用transformwithin

transform(Data, group = ave(group, patientid, FUN = fun))
#    patientid group
# 1        100     1
# 2        100     1
# 3        100     1
# 4        101     2
# 5        101     2
# 6        101     2
# 7        102     1
# 8        102     1
# 9        102     1
# 10       104     2
# 11       104     2
# 12       104     2

甚至与其他软件包:

library(data.table)
as.data.table(Data)[, group := fun(group), patientid][]

即使组值不是每个患者“患者 ID”的第一个值,这也将起作用。试试,例如:

# First row of "group" is `NA`
Data <- Data[c(3, 1, 2, 4:nrow(Data)), ]

推荐阅读