我的患者数据如下:
ID DATE DUR
82 29/08/2014 10.32
82 29/08/2014 0.32
82 12/09/2014 13.35
82 12/09/2014 0.16
82 12/09/2014 0.24
82 12/09/2014 0.31
82 22/12/2014 100.39
82 22/12/2014 0.1
219 31/11/2012 -300.32
219 31/11/2012 0.23
219 12/01/2013 80.20
219 12/01/2013 0.20
在第一列中是患者ID,在第二列中有一个日期和时间(时间在视觉上缺失但在那里),第三列只是持续时间差异(我一直用来确定不同的入场时间)耐心)。每个不同的行都是对患者的检查,但他们可能是在以后来到这里(不是在同一时间范围内)。
基本上我想要做的是能够对每个患者的数字进行分类,这样当他们第二次承认时,身份就变成了#82; 82a"第三次" 82b"等等。它不必是字母,它可以是任何这样的指标。有时可能会有多达50种不同入院的患者(单独入院)。所以在此之后我想让它看起来像:
ID DATE DUR
82 29/08/2014 10.32
82 29/08/2014 0.32
82a 12/09/2014 13.35
82a 12/09/2014 0.16
82a 12/09/2014 0.24
82a 12/09/2014 0.31
82b 22/12/2014 100.39
82b 22/12/2014 0.1
219 31/11/2012 -300.32
219 31/11/2012 0.23
219a 12/01/2013 80.20
219a 12/01/2013 0.20
我一直在Excel工作,最初使用过
=IF(AND(ABS(C3)>1,A3=A2),1,0)
只是为了表明在新的入场日期重复ID的时间,然后我再次这样做以表示第3次入场并开始抽出第4,5,6列的列并计划合并它们。这根本不是一种有效的解决方案,尤其是对于大型数据集。我熟悉R并认为这可能是一种更好的操作方式,但我只是坚持如何为整个数据集执行此操作并不断添加新的"指示符"每次同一患者再次入院。我甚至不确定如何告诉计算机如何处理伪。也许是这样的事情
Pseudo-Code
-> Run through ID Column
-> IF Dur is > 1 (it will always be > 1 for a new admission)
ANDIF ID already exists above with DUR > 1 = a, or if DUR > 1 TWICE for
same ID = b, or if DUR > THREE TIMES = c, and so on....
任何帮助都会很棒
答案 0 :(得分:0)
在R中,你有很多选择。但是,您的数据存在问题;由于11月只有30天,将KEY_UP
列转换为实际日期格式会引入DATE
s。 (当然,您可以将其保留为字符,但日期格式更容易使用。)
使用NA
:
dplyr
Base R有很多选项,包括library(dplyr)
df %>% mutate(DATE = as.Date(DATE, '%d/%m/%Y')) %>% # parse date data
group_by(ID) %>% # group data by ID
mutate(visit = as.integer(factor(DATE))) # make an integer factor of DATE
# Source: local data frame [12 x 4]
# Groups: ID [2]
#
# ID DATE DUR visit
# (int) (date) (dbl) (int)
# 1 82 2014-08-29 10.32 1
# 2 82 2014-08-29 0.32 1
# 3 82 2014-09-12 13.35 2
# 4 82 2014-09-12 0.16 2
# 5 82 2014-09-12 0.24 2
# 6 82 2014-09-12 0.31 2
# 7 82 2014-12-22 100.39 3
# 8 82 2014-12-22 0.10 3
# 9 219 <NA> -300.32 NA
# 10 219 <NA> 0.23 NA
# 11 219 2013-01-12 80.20 1
# 12 219 2013-01-12 0.20 1
和ave
,但为了简单起见,您可以在split-apply-combine模型中逐步了解会发生什么,{ {1}}通过在列表中对变量tapply
进行分组,并使用split
重新组合:
lapply