r语言 - 基于先前时间点的清洗时间序列



在我的临床数据集中,我有一个由患者ID和时间组成的唯一标识符,然后是感兴趣的变量,看起来像这样:

patientid <- c(100,100,100,101,101,101,102,102,102,104,104,104)
time <- c(1,2,3,1,2,3,1,2,3,1,2,3)
V1 <- c(1,1,NA,2,1,NA,1,3,NA,NA,1,NA)
Data <- data.frame(patientid=patientid, time=time, V1=V1)

时间点3均为空白。我想根据以下标准为每个病人填写时间点3。如果在时间点1或2,变量被编码为2或3,那么时间点3应该被编码为2。如果在时间点1和2,变量都被编码为1,那么时间点3应该被编码为1。如果时间点1或2丢失了数据,那么时间点3也应该丢失。对于玩具示例,它应该是这样的:

patientid <- c(100,100,100,101,101,101,102,102,102,104,104,104)
time <- c(1,2,3,1,2,3,1,2,3,1,2,3)
V1 <- c(1,1,1,2,1,2,1,3,2,NA,1,NA)
Data <- data.frame(patientid=patientid, time=time, V1=V1)

您可以使用tidyr中的pivot_wider将数据转换为宽格式,您可以使用purrr包中的map的帮助下使用函数用逻辑改变3列。您可以使用pivot-longer

返回到数据帧的原始形状
library(tidyverse)
patientid <- c(100,100,100,101,101,101,102,102,102,104,104,104)
time <- c(1,2,3,1,2,3,1,2,3,1,2,3)
V1 <- c(1,1,NA,2,1,NA,1,3,NA,NA,1,NA)
df <- data.frame(patientid=patientid, time=time, V1=V1)
flag <- function(t1,t2){
if(is.na(t1)|is.na(t2)){
NA
} else if(t1 %in% c(2,3)|t2 %in% c(2,3)){
2
} else if(t1 == 1|t2 == 1){
1
}else {
NA
}
}
df %>% 
as_tibble() %>% 
pivot_wider(names_from = time, values_from = V1) %>% 
mutate(`3` = pmap_dbl(list(`1`,`2`),flag )) %>% 
pivot_longer(-1, names_to = "time", values_to = "V1")
#> # A tibble: 12 x 3
#>    patientid time     V1
#>        <dbl> <chr> <dbl>
#>  1       100 1         1
#>  2       100 2         1
#>  3       100 3         1
#>  4       101 1         2
#>  5       101 2         1
#>  6       101 3         2
#>  7       102 1         1
#>  8       102 2         3
#>  9       102 3         2
#> 10       104 1        NA
#> 11       104 2         1
#> 12       104 3        NA

由reprex包(v0.3.0)在2021-01-29创建

应该可以了!

library(tidyverse)
patientid <- c(100,100,100,101,101,101,102,102,102,104,104,104)
time <- c(1,2,3,1,2,3,1,2,3,1,2,3)
V1 <- c(1,1,NA,2,1,NA,1,3,NA,NA,1,NA)
Data <- data.frame(patientid=patientid, time=time, V1=V1)
Data <- Data %>% pivot_wider(names_from = "time", values_from = "V1", 
names_prefix = "timepoint_")
timepoint_impute <- function(x,y) {
if(is.na(x) | is.na(y)) {
return(NA)
} else if(2 %in% c(x,y) | 3 %in% c(x,y)) {
return(2)
} else if(x==1 & y==1) {
return(1)
}
}
Data$timepoint_3 <- map2(.x = Data$timepoint_1, .y = Data$timepoint_2,
.f = timepoint_impute)

你最终得到宽数据格式,但如果你需要长数据格式,你可以使用tidyr::pivot_longer。这种方法编写一个自定义函数来处理所需的逻辑。

相关内容

  • 没有找到相关文章

最新更新