对于一个项目,我需要从医院预处理数据并最终制作预测模型。
在我的一个预处理步骤中,我需要创建一个列,表示患者在医院的累积天数。通过查看不同行中的其他几列来确定此数字。此外,患者可以在不同的场合多次住院。如果这很令人困惑,我很抱歉。
我添加了一张数据帧图片。我想知道如何与R进行争论,使列cdays不在列Patientid和Date中。 sample of my data
我尝试了很多方法来做到这一点。有些人使用for
和while
循环与计数器。其他人正在使用带有新向量的嵌套ifelse
(所以我之前可以将当前行与迭代行进行比较):
#i-1 en i c.days
df$c.days <- 0
df$i_min_1c.days <- 0
#i en i+1 date
iDate<-df$Date[1:(nrow(df)-1)]
i_plus_1Date<-df$Date[2:(nrow(df))]
#i en i+1 patientid
iPatientid<-df$Patientid[1:(nrow(df)-1)]
i_plus_1Patientid<-df$Patientid[2:(nrow(df))]
newNew<-c(ifelse(iPatientid==i_plus_1Patientid, ifelse(i_plus_1Date-iDate>1,1,df$i_min_1c.days + 1), 1), df$c.days[nrow(df)])
显然这不起作用,但我没有希望......有人能指出我正确的方向如何进行?
一些说明: - 完整的数据帧长800k行,宽9列(请记住转换需要很长时间) - cdays的值从1开始,因为它将用作乘数, - 如果第i个和第i + 1个之间的日期差异大于1天,则将其视为新会话,cdays值将为1。
如果您需要更多信息,请随时提出。我会尽我的全力!非常感谢,我很抱歉我的英语不好。
答案 0 :(得分:0)
鉴于您拥有大型数据集,请使用data.table
。
library(data.table)
setDT(df) #convert to data table
setorder(df, Patientid, Date) #am assuming your dates are R dates and not characters
df[, cdays := ifelse(
Date == shift(Date) + 1,
shift(cdays) + 1,
1
),
by=Patientid]
问题很模糊,我可能很容易误解它。