我的临床数据结构如下所示:
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)
发布于 2020-12-14 23:32:33
您可以编写一个小辅助函数,如下所示:
fun <- function(x) replace(x, is.na(x), x[!is.na(x)][1])
然后,您可以在基本R中的transform
或within
中使用它:
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][]
即使组值不是每个患者"patientid“的第一个值,这也是有效的。尝试一下,例如:
# First row of "group" is `NA`
Data <- Data[c(3, 1, 2, 4:nrow(Data)), ]
发布于 2020-12-14 23:22:50
我们可以在按“patientid”分组后使用tidyr
中的fill
。
library(dplyr)
library(tidyr)
Data %>%
group_by(patientid) %>%
fill(group) %>%
ungroup
-output
# A tibble: 12 x 2
# patientid group
# <dbl> <dbl>
# 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
发布于 2020-12-15 01:35:21
使用ave
的base R选项可以实现这一点
transform(
Data,
group = ave(group, patientid, FUN = function(x) unique(na.omit(x)))
)
这给了我们
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
nafill
的data.table
选项
setDT(Data)[, group := nafill(group, fill = unique(na.omit(group))), patientid]
这给了我们
> Data
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
https://stackoverflow.com/questions/65297927
复制相似问题