我是R的新手,我有一个500000条患者ID和日期以及其他变量的数据框。
我想删除任何重复的重复患者ID(PtID),如果它们恰好在他们第一次出现的一年内到来。 例如:
PtID date**
1. 1 01/01/2006
2. 2 01/01/2006
3. 1 24/02/2006
4. 4 26/03/2006
5. 1 04/05/2006
6. 1 05/05/2007
在这种情况下,我想删除第3行和第5行并保留第1行和第6行..
有人可以帮我这个吗... 这是str(我的数据叫做final1)
str(final1)
'data.frame': 605870 obs. of 70 variables:
...
$ Date : Date, format: "2006-03-12" "2006-04-01" ...
$ PtID : int 11251 11251 11251 11251 11251 11251 11251 30938 30938 11245 ...
...
答案 0 :(得分:1)
这是一个使用ply
和lubridate
的解决方案。首先加载包:
require(plyr)
require(lubridate)
接下来创建一些示例数据(请注意,这比您的示例更简单!)
num = 1:6
PtID = c(1,2,1,4,1,1)
date = c("01/01/2006", "01/01/2006","24/02/2006", "26/03/2006", "04/05/2006",
"05/05/2007")
dd = data.frame(PtID, date)
现在我们将date
列设为R日期对象:
dd$date = dmy(date)
以及包含是否应包含行的规则的函数:
keepId = function(dates) {
keep = ((dates - min(dates)) > 365*24*60*60) |
((dates == min(dates)))
return(keep)
}
剩下的就是使用ddply
按PtID
dd_sub = ddply(dd, c("PtID"), transform, keep = keepId(date))
dd_sub[dd_sub$keep,]