繁体   English   中英

R中相邻列的日期之间的时差

[英]Time difference between dates of adjacent columns in R

我正在尝试使答案适应上一个问题( R中许多列中的日期之间的差异 )。 我已经意识到我只想要给定列与紧接其左边的列之间的时间差。 澄清示例:

df <- data.frame(
  Group=c("A","B"),
  ID=c(1,2),
  Date1=as.POSIXct(c('2016-04-25 09:15:29','2016-04-25 09:15:29')),
  Date2=as.POSIXct(c('2016-04-25 14:01:19','2016-04-25 14:01:19')),
  Date3=as.POSIXct(c('2016-04-26 13:28:19','2016-04-26 13:28:19')),
  stringsAsFactors=F
)

我想要的输出是Date2-Date1和Date3-Date2。 这当然可以扩展到许多列,例如Date4-Date3等。但是我不需要Date3-Date1。 要澄清的是,如何对许多列进行自动处理

df$Date2_Date1 <- difftime(df$Date2,df$Date1, units = c("hours"))
df$Date3_Date2 <- difftime(df$Date3,df$Date2, units = c("hours"))

感谢@bgoldst的原始答案。 我想我只需要适应以下cmb即可获得正确的顺序:

cmb <- combn(seq_len(ncol(df)-1L)+1L,2L);
res <- abs(apply(cmb,2L,function(x) difftime(df[[x[1L]]],df[[x[2L]]],units='hours')));
colnames(res) <- apply(cmb,2L,function(x,cns) paste0(cns[x[1L]],'_',cns[x[2L]]),names(df))

谢谢

以您的示例为例,这应该达到目的:

df <- data.frame(
  Group=c("A","B"),
  ID=c(1,2),
  Date1=as.POSIXct(c('2016-04-25 09:15:29','2016-04-25 09:15:29')),
  Date2=as.POSIXct(c('2016-04-25 14:01:19','2016-04-25 14:01:19')),
  Date3=as.POSIXct(c('2016-04-26 13:28:19','2016-04-26 13:28:19')),
  stringsAsFactors=F
)
mapply(difftime, df[, 4:5], df[, 3:4], units = "hours")

>日期2日期3
> [1,] 4.763889 23.45
> [2,] 4.763889 23.45

在我的调用中, mapply将函数mapply应用于提供的两个数组,因此它以df[, 4] - df[, 3] difftime df[, 4] - df[, 3]开头,然后是df[, 5] - df[, 4] 当然,您必须使用日期的列号进行更改,并确保以正确的方式订购它们。

祝好运!

您可以使用非标准评估:

  1. 首先,使用包含日期的列的名称创建一个字符向量。 因此,假设所有以“日期”开头的列

     dates = names(df)[grepl("^Date", names(df))] 
  2. 我们创建公式列表,以动态计算相邻列之间的差:

     all_operations = lapply(seq_len(length(dates) - 1), function(i){ as.formula(paste("~difftime(", dates[i + 1], ",", dates[i],", units = c('hours'))")) }) 

    这将创建公式:

     [[1]]: ~difftime(Date2, Date1, units = c("hours")) [[2]]: ~difftime(Date3, Date2, units = c("hours")) 
  3. 然后,您可以使用dplyr的NSE mutate_应用上面生成的动态公式:

     df %>% mutate_(.dots = setNames(all_operations, paste0("Diff", seq_len(length(dates) - 1)))) 

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM