Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/80.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
R中特定事件之间的日期差异_R_Datediff - Fatal编程技术网

R中特定事件之间的日期差异

R中特定事件之间的日期差异,r,datediff,R,Datediff,我花了相当长的时间试图计算特定事件之间的日期差异。例如,我有下面的数据集,其中t是事件日期时间,e是事件('A'或'R'),id是标识符 t e id 2013-06-15 20:59:17 A 086 2013-06-26 18:02:09 R 086 2013-06-27 03:17:07 A 086 2013-06-01 11:34:09 R 115 2013-06-16 19:59:08 R 522 2013-06-16 20:

我花了相当长的时间试图计算特定事件之间的日期差异。例如,我有下面的数据集,其中t是事件日期时间,e是事件('A'或'R'),id是标识符

t e id 2013-06-15 20:59:17 A 086 2013-06-26 18:02:09 R 086 2013-06-27 03:17:07 A 086 2013-06-01 11:34:09 R 115 2013-06-16 19:59:08 R 522 2013-06-16 20:05:04 R 522 2013-06-07 09:31:15 A 524 2013-06-09 16:24:04 R 524 2013-06-14 03:38:09 A 524 2013-06-16 15:49:09 R 524 2013-06-21 03:54:19 A 524 2013-06-12 12:34:37 A 638 2013-06-12 13:15:27 A 638 2013-06-15 16:12:23 R 638 2013-06-18 22:05:03 A 638 2013-06-28 13:30:20 R 638 2013-06-28 22:20:12 A 638 2013-06-01 18:34:46 A 836 2013-06-01 18:44:53 A 836 2013-06-03 14:35:09 R 836 2013-06-03 20:25:51 A 836 2013-06-03 20:27:25 A 836 2013-06-03 20:32:17 A 836 2013-06-08 16:22:07 R 836 2013-06-12 13:12:21 A 836 2013-06-12 13:15:16 A 836 2013-06-12 13:18:53 A 836 2013-06-12 18:59:24 A 836 2013-06-23 21:14:12 R 836 2013-06-24 20:16:11 R 836 2013-06-25 03:34:29 A 836 2013-06-26 20:33:11 R 836 电话号码 2013-06-15 20:59:17A 086 2013-06-26 18:02:09 R 086 2013-06-27 03:17:07A 086 2013-06-01 11:34:09 R 115 2013-06-16 19:59:08 R 522 2013-06-16 20:05:04 R 522 2013-06-07 09:31:15A 524 2013-06-09 16:24:04 R 524 2013-06-14 03:38:09 A 524 2013-06-16 15:49:09 R 524 2013-06-21 03:54:19 A 524 2013-06-12 12:34:37 A 638 2013-06-12 13:15:27 A 638 2013-06-15 16:12:23 R 638 2013-06-18 22:05:03 A 638 2013-06-28 13:30:20 R 638 2013-06-28 22:20:12A 638 2013-06-01 18:34:46 A 836 2013-06-01 18:44:53 A 836 2013-06-03 14:35:09 R 836 2013-06-03 20:25:51 A 836 2013-06-03 20:27:25A 836 2013-06-03 20:32:17A 836 2013-06-08 16:22:07 R 836 2013-06-12 13:12:21A 836 2013-06-12 13:15:16 A 836 2013-06-12 13:18:53 A 836 2013-06-12 18:59:24A 836 2013-06-23 21:14:12 R 836 2013-06-2420:16:11R 836 2013-06-2503:34:29A 836 2013-06-26 20:33:11 R 836 我想创建一个新的数据集,其中,对于每个id,“a”事件和“R”事件之间的日期时间差(以天为单位)

对于每个id:如果E之前没有事件A,则不计算任何内容。如果两个事件E之前有三个事件A,则计算第一个事件A和第一个事件E的差异天数。如果只有事件A或E,则不计算任何内容。然后,对于id=086115638,我想得到这个双工(id,天)(086,10.9)(638,3.2)(638,9.6)。id=115没有出现,或者可能是NaN,因为它只有一个事件R,之前没有事件A

id days 086 10.9 (Ex. 2013-06-26 18:02:09 - 2013-06-15 20:59:17) 524 2.3 524 2.5 638 3.2 638 9.6 836 1.8 836 4.8 (Ex. 2013-06-08 16:22:07 - 2013-06-03 20:25:51) 836 11.3 836 1.7 身份证天数 086 10.9(例如2013-06-26 18:02:09-2013-06-15 20:59:17) 524 2.3 524 2.5 638 3.2 638 9.6 836 1.8 8364.8(例如2013-06-08 16:22:07-2013-06-03 20:25:51) 836 11.3 836 1.7 我将此代码用作第一种方法:

聚合(如.POSIXct(df$t)、列表(df$id)、差异)

有什么办法吗?提前谢谢

数据帧的dput是:

> dput(df) structure(list(t = c("2013-06-15 20:59:17", "2013-06-26 18:02:09", "2013-06-27 03:17:07", "2013-06-01 11:34:09", "2013-06-16 19:59:08", "2013-06-16 20:05:04", "2013-06-07 09:31:15", "2013-06-09 16:24:04", "2013-06-14 03:38:09", "2013-06-16 15:49:09", "2013-06-21 03:54:19", "2013-06-12 12:34:37", "2013-06-12 13:15:27", "2013-06-15 16:12:23", "2013-06-18 22:05:03", "2013-06-28 13:30:20", "2013-06-28 22:20:12", "2013-06-01 18:34:46", "2013-06-01 18:44:53", "2013-06-03 14:35:09", "2013-06-03 20:25:51", "2013-06-03 20:27:25", "2013-06-03 20:32:17", "2013-06-08 16:22:07", "2013-06-12 13:12:21", "2013-06-12 13:15:16", "2013-06-12 13:18:53", "2013-06-12 18:59:24", "2013-06-23 21:14:12", "2013-06-24 20:16:11", "2013-06-25 03:34:29", "2013-06-26 20:33:11" ), e = c("A", "R", "A", "R", "R", "R", "A", "R", "A", "R", "A", "A", "A", "R", "A", "R", "A", "A", "A", "R", "A", "A", "A", "R", "A", "A", "A", "A", "R", "R", "A", "R"), id = c("086", "086", "086", "115", "522", "522", "524", "524", "524", "524", "524", "638", "638", "638", "638", "638", "638", "836", "836", "836", "836", "836", "836", "836", "836", "836", "836", "836", "836", "836", "836", "836")), .Names = c("t", "e", "id"), row.names = c(855945L, 1481100L, 1508045L, 16944L, 920490L, 921005L, 349201L, 494172L, 746450L, 904442L, 1163757L, 653045L, 654357L, 834901L, 1047932L, 1583218L, 1613753L, 36421L, 37178L, 139968L, 162274L, 162417L, 162804L, 430725L, 654254L, 654350L, 654453L, 670726L, 1333676L, 1384583L, 1401293L, 1491782L), class = "data.frame") >dput(df) 结构(列表)t=c(“2013-06-15 20:59:17”、“2013-06-26 18:02:09”, "2013-06-27 03:17:07", "2013-06-01 11:34:09", "2013-06-16 19:59:08", "2013-06-16 20:05:04", "2013-06-07 09:31:15", "2013-06-09 16:24:04", "2013-06-14 03:38:09", "2013-06-16 15:49:09", "2013-06-21 03:54:19", "2013-06-12 12:34:37", "2013-06-12 13:15:27", "2013-06-15 16:12:23", "2013-06-18 22:05:03", "2013-06-28 13:30:20", "2013-06-28 22:20:12", "2013-06-01 18:34:46", "2013-06-01 18:44:53", "2013-06-03 14:35:09", "2013-06-03 20:25:51", "2013-06-03 20:27:25", "2013-06-03 20:32:17", "2013-06-08 16:22:07", "2013-06-12 13:12:21", "2013-06-12 13:15:16", "2013-06-12 13:18:53", "2013-06-12 18:59:24", "2013-06-23 21:14:12", "2013-06-24 20:16:11", "2013-06-25 03:34:29", "2013-06-26 20:33:11" ),e=c(“A”、“R”、“A”、“R”、“R”、“R”、“A”、“R”、“A”、“R”、“A”、“R”、“A”、“R”、“A”), “A”、“A”、“R”、“A”、“R”、“A”、“A”、“A”、“A”、“R”、“A”、“A”、“A”、“A”、“R”, “A”、“A”、“A”、“A”、“R”、“R”、“A”、“R”),id=c(“086”、“086”, "086", "115", "522", "522", "524", "524", "524", "524", "524", "638", "638", "638", "638", "638", "638", "836", "836", "836", "836", "836", "836", "836", "836", "836", "836", "836", "836", “836”,“836”,“836”),.Names=c(“t”,“e”,“id”),row.Names=c(855945L, 1481100L、1508045L、16944L、920490L、921005L、349201L、494172L、, 746450L、904442L、1163757L、653045L、654357L、834901L、1047932L、, 1583218L、1613753L、36421L、37178L、139968L、162274L、162417L、, 162804L、430725L、654254L、654350L、654453L、670726L、1333676L、, 1384583L、1401293L、1491782L),class=“data.frame”)
以下是一行解决方案,使用
plyr
包中的
ddply
函数和
lubridate
包解析日期

代码:

请注意,有两个警告,因为
id
s 115和522没有
e
变量的值

如果希望日期差为十进制值,可以使用
as.double
函数,如下所示:

基本上,我使用
match
函数查找
A
R
的第一个匹配项,使用
lubridate
包中的
ymd\u hms
函数解析日期变量,然后查找两个日期的差异。我将其四舍五入到小数点后1位,然后将其转换为
double
显示

编辑 在阅读了OPs的评论之后,这里有一个相当丑陋的方法来获得想要的结果。请原谅,这是清晨,它可能不优雅或效率,但它似乎输出所需的结果

代码:

其思想是添加另一列,该列根据“R”事件的发生情况对行进行分组,以便我可以根据ID和“R”事件对数据集进行子集划分。这是一种黑客行为,我相信有更优雅的方式来做到这一点

现在,我要去喝点咖啡。

这里有一个方法

df <- transform(df, t=as.POSIXct(t))
sp <- split(df, df$id)
calc_diff <- function(x) {
    start <- min(subset(x, e=="A")$t)
    end <- min(subset(x, e=="R")$t)
    return(end-start)
}
sapply(sp, FUN=calc_diff)

df不需要任何东西,只需要基本的R。对data.frame进行排序,选择“第一个”外观,最后使用与您使用的类似的聚合:

df <- df[do.call(order, df), ]
df <- df[!duplicated(df[, c("id", "e")]), ]
tdiff <- function(x) {
  if(length(x) == 2) {
     rv <- as.numeric(difftime(strptime(x[2], format="%Y-%m-%d %H:%M:%S"),
                               strptime(x[1], format="%Y-%m-%d %H:%M:%S"),
                               units = "days"))
  } else {
     rv <- NA
  }
  rv
}

rv <- aggregate(df$t, by = list(id = df$id), tdiff)

df您可以
dput
您的数据以便更容易进入R@JakeBurkhead:我加了一句。谢谢您的输出有时会显示给定id的几个时间跨度。这与“第一个a到第一个R事件”有何关系?@KarstenW.:例如,对于id==836,第一个区别是:df[df$id==836&df$tAnd当给定id的“A”事件数与“E”事件数不匹配时,您希望发生什么?例如,id=086115638?谢谢。它部分起作用,因为id 524必须出现2次(2.3天和2.5天),并且出现1次(2.3天).我的意思是2013-06-09 16:24:04-2013-06-07 09:31:15=2.3和2013-06-16 15:49:09-2013-06-14 03:38:09=2.5嗯,好吧。当我读到这个问题时,我想你只是想知道两者之间的区别
grouper <- function(var, group) {
  num <- 1
  res <- c(1:length(var))
  for(i in 1:length(var)) {
    res[i] <- num
    if(var[i]==group) {
      num <- num+1
    }
  }
  return(res)
}

df2 <- df
df2$group <- ddply(.data=df, .variables='id', summarize, group=grouper(e,'R'))$group

df3 <- ddply(.data=df2, .variables=c('id','group'), summarize,
             days=round(ymd_hms(t[match('R',e)])-ymd_hms(t[match('A',e)]),1))

df3[complete.cases(df3),-2]
    id      days
1  086 10.9 days
6  524  2.3 days
7  524  2.5 days
9  638  3.2 days
10 638  9.6 days
12 836  1.8 days
13 836  4.8 days
14 836 11.3 days
16 836  1.7 days
df <- transform(df, t=as.POSIXct(t))
sp <- split(df, df$id)
calc_diff <- function(x) {
    start <- min(subset(x, e=="A")$t)
    end <- min(subset(x, e=="R")$t)
    return(end-start)
}
sapply(sp, FUN=calc_diff)
df <- df[do.call(order, df), ]
df <- df[!duplicated(df[, c("id", "e")]), ]
tdiff <- function(x) {
  if(length(x) == 2) {
     rv <- as.numeric(difftime(strptime(x[2], format="%Y-%m-%d %H:%M:%S"),
                               strptime(x[1], format="%Y-%m-%d %H:%M:%S"),
                               units = "days"))
  } else {
     rv <- NA
  }
  rv
}

rv <- aggregate(df$t, by = list(id = df$id), tdiff)
df <- df[do.call(order, df), ]
df_a <- subset(df, e == "A")
df_a <- df_a[!duplicated(df_a[, c("id", "e")]), ]
df_r <- subset(df, e == "R")
df_r[, 'A'] <- df_a[match(df_r$id, df_a$id), 't']
df_r[, 'R_A'] <- as.numeric(difftime(strptime(df_r[, 't'], format="%Y-%m-%d %H:%M:%S"),
                           strptime(df_r[, 'A'], format="%Y-%m-%d %H:%M:%S"),
                           units = "days"))
rv <- df_r[, c('id', 'R_A')]
rv[!is.na(rv$R_A) & rv$R_A < 0, 'R_A'] <- NA
rv <- rv[!duplicated(rv), ]