【问题标题】:Time difference between dates of adjacent columns in RR中相邻列的日期之间的时间差
【发布时间】:2016-09-17 09:42:49
【问题描述】:

我正在尝试根据我之前的问题 (Difference between dates in many columns in 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))

谢谢

【问题讨论】:

    标签: r


    【解决方案1】:

    鉴于你的例子,这应该是诀窍:

    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 将函数 difftime 应用于提供的两个数组,因此它以 df[, 4] - df[, 3] 开头,然后是 df[, 5] - df[, 4]。当然,您必须使用日期的列号来更改它,并确保它们以正确的方式排序。

    祝你好运!

    【讨论】:

    • 您可以使用which 找到相应的列,然后通过简单地加/减data.frame 来计算相邻列。
    • 感谢 Jasper,这非常有效。 Roman,你介意用一些示例代码来澄清一下,这样我就可以尝试了。
    【解决方案2】:

    您可以使用非标准评估:

    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))))
      

    【讨论】:

    • 谢谢洛伦佐。我希望我能接受两个答案。这也非常有效!我接受 Jaspers 的唯一原因是因为我更了解它,这可能不是一个好的理由。
    猜你喜欢
    • 1970-01-01
    • 2017-06-27
    • 2021-10-18
    • 2012-04-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多