如果在R中满足某些行和列之间的条件,则确定一个值

时间:2018-04-17 15:13:49

标签: r dataframe bigdata nested-loops

对于一个项目,我需要从医院预处理数据并最终制作预测模型。

在我的一个预处理步骤中,我需要创建一个列,表示患者在医院的累积天数。通过查看不同行中的其他几列来确定此数字。此外,患者可以在不同的场合多次住院。如果这很令人困惑,我很抱歉。

我添加了一张数据帧图片。我想知道如何与R进行争论,使列cdays不在列Patientid和Date中。 sample of my data

我尝试了很多方法来做到这一点。有些人使用forwhile循环与计数器。其他人正在使用带有新向量的嵌套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。

如果您需要更多信息,请随时提出。我会尽我的全力!非常感谢,我很抱歉我的英语不好。

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]

问题很模糊,我可能很容易误解它。