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

Posted

技术标签:

【中文标题】如果在 R 中满足某些行和列之间的条件,则确定一个值【英文标题】:Determine a value if conditions between certain rows and columns are met in R 【发布时间】:2018-04-17 15:13:49 【问题描述】:

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

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

我添加了一张数据框的图片。我想知道如何使用 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。

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

【问题讨论】:

'这个数字是通过查看其他几列来确定的' - 请提供它们。 我建议您阅读一些关于提供一个好问题的内容:SO q/a on reproducibliity、SO's help/mcve 和 SO's how-to-ask。底线:如果您无法在新的/空的 R 会话中执行此问题中的代码,那么其他人也不能,通常很难提供相关的建议或答案。 (用不同的方式说与 r2e 相同的事情)我们不需要查看您的实际数据。相反,您应该努力为我们制作一个最小的可重现示例,以涵盖您面临的问题:***.com/questions/5963269/… 从 Patientid 和 Date 列中创建 cdays 列 ...但是您的示例屏幕截图有这样的列 cdays。你的目标是什么? 我想知道如何用R代码制作这样一个专栏。我已经用我正在寻找的结果制作了一个样本。 【参考方案1】:

鉴于您有一个大型数据集,请使用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]

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

【讨论】:

以上是关于如果在 R 中满足某些行和列之间的条件,则确定一个值的主要内容,如果未能解决你的问题,请参考以下文章

R重复功能直到满足条件

Pandas:使用大文件的行和列的条件优化迭代

使用r自动选择.csv文件中的行和列

MYSQL 存储过程 - 如果满足某些条件,则更新多个列

如果在 R 中满足条件,则从前一行获取值并连接

使用SQL获取行和列取决于值? [重复]