首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >R:如果重复条目在一年内出现,则将其删除

R:如果重复条目在一年内出现,则将其删除
EN

Stack Overflow用户
提问于 2012-05-09 21:00:45
回答 1查看 184关注 0票数 2

我是R的新手,我有一个包含患者ID、日期和其他变量的500000个条目的数据框架。

我希望删除任何重复的患者ID(PtID),如果它们恰好在第一次出现的一年内出现。例如:

代码语言:javascript
运行
复制
 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行。

有没有人能帮帮我..这是字符串(我的数据,称为final1)

代码语言:javascript
运行
复制
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 ...
...
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-05-09 21:43:44

这里有一个使用plylubridate的解决方案。首先加载这些包:

代码语言:javascript
运行
复制
require(plyr)
require(lubridate)

接下来,创建一些示例数据(请注意,这比您的示例更简单!)

代码语言:javascript
运行
复制
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 date对象:

代码语言:javascript
运行
复制
dd$date = dmy(date)

和一个包含是否应该包含行的规则的函数:

代码语言:javascript
运行
复制
keepId = function(dates) {
  keep = ((dates - min(dates)) > 365*24*60*60) |
  ((dates == min(dates)))
  return(keep)
}

剩下的工作就是使用ddply根据PtID对日期框架进行分区

代码语言:javascript
运行
复制
dd_sub = ddply(dd, c("PtID"), transform, keep = keepId(date))
dd_sub[dd_sub$keep,]
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/10516685

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档