全部版块 我的主页
论坛 数据科学与人工智能 数据分析与数据科学 R语言论坛
8043 14
2017-02-11
悬赏 100 个论坛币 已解决
数据data有如下变量:
id为患者编号,disease为病种,time1为入院时间,time2为出院时间。现在要新建一列outcome,指代患者是否治疗有效。规则是:若患者t天内(后次住院的出院时间与前次住院的出院时间之间的间隔)因同样病种住院,则判断前次住院治疗无效。
尝试了很多方法,都没有成功,不知道论坛有没有高手能指点下。希望尽量避免循环,如果必须循环实现也可以。
sample_211.xlsx
大小:(31.97 KB)

 马上下载

最佳答案

zerofung 查看完整内容

我理解和表达可能有点错乱。是这样的: 需要分n=1 和 n > 1然后再合并,是肯定的。 n=1的全部赋予good,也是对的。 n>1的部分,应该改为time3 = lead(time1) - time2,这样可以使得good 和 bad 对应着前一次治疗。 另外rbind避免出错,需要确保两个data列数是对应的,你可以给前一个加个全是NA的time3列,也可以后一个去掉time3这一列。应该表达完整了吧,望采纳,祝成功。
二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

全部回复
2017-2-11 14:51:36
梦孟小宝 发表于 2017-2-12 08:31
arrange 那个问题是我自己弄错了,不好意思~
我理解和表达可能有点错乱。是这样的:
需要分n=1 和 n > 1然后再合并,是肯定的。
n=1的全部赋予good,也是对的。
n>1的部分,应该改为time3 = lead(time1) - time2,这样可以使得good 和 bad 对应着前一次治疗。
另外rbind避免出错,需要确保两个data列数是对应的,你可以给前一个加个全是NA的time3列,也可以后一个去掉time3这一列。应该表达完整了吧,望采纳,祝成功。
二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

2017-2-11 15:09:08
如果用stata软件很好处理:
以id,disease分组,对每一行求上次同患者同病因住院的出院时间,计算这次入院和上次出院的时间间隔,若时间间隔大于t,则对outcome赋值1。 bysort id disease: gen last_time2=time2[_n-1]; gen interval=time1-last_time2; gen outcome=0; replace outcome=1 if interval>30
但是不知道R应该怎么写程序
二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

2017-2-11 19:13:08
能不能提供一下作为例子的数据?
二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

2017-2-11 19:56:43
初步想法是这样的,
library(tidyverse)
data %>% group_by(id,disease) %>% #是按患者和病种分组
  filter(n() > 1) %>%  #某患者同病种只入院一次的,就没有“有效无效”一说了对不对
  arrange(id,disease,time1) %>%  #按入院时间排序,后面的入院肯定比前一次出院时间靠后对不对
  mutate(time3 = time1 - lag(time2)) %>% #lag应该就是本问题核心了,用入院时间减去上一次出院时间,所得结果作为time3列
  mutate(outcome = ifelse(time3 < t, "bad", "good")) #根据time3与t的大小比较做outcome列,完成


当然啦你的日期需要是可以加减计算的格式而不是字符串,推荐lubridate包。
二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

2017-2-12 00:11:10
zerofung 发表于 2017-2-11 19:56
初步想法是这样的,
library(tidyverse)
data %>% group_by(id,disease) %>% #是按患者和病种分组
谢谢回复!!非常感谢你在我只言片语中能完全弄清楚我的问题!
样本数据(sample_211.xls)已经上传到本帖中,但是只是一小部分样本,有可能没有同患者因同病种多次住院的情况,但是对于您了解数据情况和编写程序应该够了。
还有几个问题想请教:
1. arrange(id,disease,time1) 时间数据可以arrange排序吗?我运行的时候总是报错“Error in UseMethod("arrange_") :   no applicable method for 'arrange_' applied to an object of class "function"”
2. filter之后是相当于新生成了一个数据集,还是在原始数据的基础上进行了更改呢?若患者同病种只入院一次,那暂且判断患者治疗有效,也就是对应的outcome的值是good。outcome的数据(包括有效和无效的病例)是要在后续分析中使用的,所以需要在原始数据data中进行更改,而不是生成一个只包含n>2的数据集。
3. 日期数据as.Date 之后不能直接加减运算吗?如果用lubridate包,能不能说具体点怎么用呢?是要跟mutate函数和lag函数整合使用吗?
我也是最近刚学习R,有很多不明白的地方,请多多指点,谢谢啦!终于看到可行的曙光了~谢谢~
二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

点击查看更多内容…
相关推荐
栏目导航
热门文章
推荐文章

说点什么

分享

扫码加好友,拉您进群
各岗位、行业、专业交流群