根据不同日期变量的观测值的存在或缺失生成新的因子变量

问题描述

我有以下数据

R 代码

df <- data.frame(idnum = c(1001,1002,1003,1004),date1 = c(2003-03-19,2003-03-19,2003-03-19),date2 = c(2004-03-24,NA,2004-03-25,2004-03-26),date3 = c(2005-05-11,2005-05-12,NA))

并且想做类似下面我在Stata中所做的事情

Stata 代码

gen xvisit=1 if date1 !=. & date2 !=. & date3!=.
replace xvisit=2 if date1 !=. & date2 !=. & date3 ==. 
replace xvisit=3 if date1 !=. & date2 ==. & date3 !=.
replace xvisit=4 if date1 !=. & date2 ==. & date3 ==.
label define xvisit 1 "All" 2 "Baseline & 2nd" 3 "Baseline & 3rd" 4 "Baseline only"
label values xvisit xvisit

但我就是无法在 R 中正确使用。 我的目标是得到类似的东西

Stata Output

在此处输入图片描述

enter image description here

描述

解决方法

您可以使用 within 执行此操作。在 R 中,我们开始用 NA 初始化 xvisit 列。要按行查找所有日期都缺失的地方,我们可以有效地使用否定 rowSums 检查的 is.na - 当它是 3 时,我们得到了它。其他行应该是不言自明的。最后,我们创建一个 factor,其中 levels= 对应于数值,labels= 对应于级别。

您可能还需要考虑预先使用 as.Date 将字符日期转换为日期格式。

df[c("date1","date2","date3")] <- lapply(df[c("date1","date3")],as.Date)

df <- within(df,{
  xvisit <- NA
  xvisit[rowSums(!is.na(df[c("date1","date3")])) == 3] <- 1
  xvisit[is.na(df[["date3"]])] <- 2
  xvisit[is.na(df[["date2"]])] <- 3
  xvisit[is.na(df[["date1"]])] <- 4
  xvisit <- factor(xvisit,levels=1:4,labels=c("All","Baseline & 2nd","Baseline & 3rd","Baseline only"))
})
df
#   idnum      date1      date2      date3         xvisit
# 1  1001 2003-03-19 2004-03-24 2005-05-11            All
# 2  1002 2003-03-19       <NA> 2005-05-12 Baseline & 3rd
# 3  1003 2003-03-19 2004-03-25 2005-05-12            All
# 4  1004 2003-03-19 2004-03-26       <NA> Baseline & 2nd

数据:

df <- structure(list(idnum = c(1001,1002,1003,1004),date1 = c("2003-03-19","2003-03-19","2003-03-19"),date2 = c("2004-03-24",NA,"2004-03-25","2004-03-26"),date3 = c("2005-05-11","2005-05-12",NA)),class = "data.frame",row.names = c(NA,-4L
))