根据单独的列删除重复日期

时间:2014-06-10 18:06:13

标签: r for-loop merge

我的数据主管如下:

     IndID Event       Date
148   P01     1 2011-03-04
147   P01     1 2011-03-11
149   P01     0 2011-03-13
150   P01     0 2011-03-14
151   P01     0 2011-03-14
152   P01     0 2011-03-14  

共有3个人(P01,P03,P06)。 "事件"指定是否发生事件(0 =否,1 =是) "日期"是监测日期。

我的目标是根据每个人的“事件”列删除重复日期。如果存在重复项并且没有发生事件(给定日期的所有事件值都为0),则应删除重复项并且事件应保持为0.当存在重复日期并且存在事件(意味着至少有一个事件)值是1),然后我试图删除重复项,并在事件列中为给定日期留下一行1。

虽然this 帖子很有用,但我正在寻找更具体的内容。目前,我正在努力使用嵌套的for()循环,这可能过于复杂而且没有必要。

任何建议都将不胜感激!我的数据如下:

如果它是相关的,一旦我为每个人设置了一个日期,我就希望通过将一个序列(从每个人的第一个日期到最后一个日期)与现有数据合并并添加来添加缺少的日期Event列中的0为新条目。

DP <- structure(list(IndID = structure(c(1L, 1L, 1L, 1L, 1L, 1L, 1L, 
1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 
3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 
3L, 3L, 5L, 5L, 5L, 5L, 5L, 5L, 5L, 5L, 5L, 5L, 5L, 5L, 5L, 5L, 
5L, 5L), .Label = c("P01", "P02", "P03", "P05", "P06", "P07", 
"P08", "P09", "P10", "P11", "P12", "P13"), class = "factor"), 
    Event = c(1L, 1L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 
    1L, 0L, 0L, 0L, 0L, 0L, 1L, 0L, 1L, 0L, 0L, 0L, 0L, 1L, 0L, 
    0L, 1L, 0L, 1L, 1L, 1L, 1L, 1L, 0L, 0L, 0L, 1L, 0L, 1L, 0L, 
    1L, 1L, 0L, 0L, 0L, 1L, 0L, 1L, 0L, 0L, 0L, 1L, 0L, 1L, 1L
    ), Date = structure(c(1299196800, 1299801600, 1299974400, 
    1300060800, 1300060800, 1300060800, 1300147200, 1300320000, 
    1300406400, 1300406400, 1300492800, 1300492800, 1300665600, 
    1300924800, 1301097600, 1302048000, 1302134400, 1302220800, 
    1302652800, 1302825600, 1302998400, 1303084800, 1303171200, 
    1303257600, 1303689600, 1303862400, 1304208000, 1304380800, 
    1304553600, 1304640000, 1305072000, 1305590400, 1305676800, 
    1305676800, 1305676800, 1305763200, 1305936000, 1306022400, 
    1306022400, 1306108800, 1306368000, 1323129600, 1323388800, 
    1323648000, 1323993600, 1324080000, 1324166400, 1324339200, 
    1327622400, 1327622400, 1327795200, 1327881600, 1327881600, 
    1328486400, 1328659200, 1328832000, 1329177600), class = c("POSIXct", 
    "POSIXt"), tzone = "GMT")), .Names = c("IndID", "Event", 
"Date"), row.names = c(148L, 147L, 149L, 150L, 151L, 152L, 153L, 
51L, 52L, 154L, 53L, 155L, 145L, 156L, 157L, 373L, 382L, 384L, 
361L, 385L, 349L, 387L, 386L, 388L, 341L, 360L, 339L, 334L, 366L, 
340L, 363L, 352L, 351L, 353L, 355L, 397L, 336L, 337L, 354L, 335L, 
371L, 475L, 417L, 472L, 492L, 494L, 493L, 473L, 468L, 497L, 495L, 
486L, 499L, 470L, 487L, 496L, 469L), class = "data.frame")

1 个答案:

答案 0 :(得分:1)

你真的没有那么多删除重复项,你只是简单地聚合。听起来你只想要每个人的每个日期的最大事件值(如果有事件,则为1;如果没有,则为0)。

aggregate(Event~Date+IndID, DP, max)

这应该可以解决问题。如果您还要跟踪其他数据列,请尝试使用此方法

inddate <- with(DP, ave(Event, Date, IndID, 
    FUN=function(x)seq_along(x)==which.max(x)))
DP[inddate==1, ]