繁体   English   中英

R中许多列中日期之间的差异

[英]Difference between dates in many columns in R

我的数据看起来像这样:

ID Date1               Date2               Date3
A  2016-04-25 09:15:29 2016-04-25 14:01:19 2016-04-26 13:28:19
B  2016-04-25 09:15:29 2016-04-25 14:01:19 2016-04-26 13:28:19

我希望每个日期组合之间的小时差异(理想情况下只是在时间上前进,即没有负差异)。 我知道如何手动执行此操作( 计算数据框中两列日期之间的天数 ):

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

但是,我的真实数据框架要大得多,这将非常繁琐(但可能)。 我已经读过这个( 计算数据帧中每对列之间的成对差异 )和这个( R:比较矩阵中成对的所有列 ),这使我尝试这样做:

nm1 <- outer(colnames(df), colnames(df), paste, sep="_")
indx1 <-  which(lower.tri(nm1, diag=TRUE))
df2 <- outer(1:ncol(df), 1:ncol(df), 
             function(x,y) df[,x]-df[,y])

我认为这让我很接近,但我的理想输出是这样的:

ID Date2_Date1 Date3_Date1 Date3_Date2
A  x hours     y hour      ...
B  ..

对此有什么好的解决方案吗?

这是一种基于combn()apply()

df <- data.frame(
    ID=c('A','B'),
    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
);

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));
res;
##      Date1_Date2 Date1_Date3 Date2_Date3
## [1,]    4.763889    28.21389       23.45
## [2,]    4.763889    28.21389       23.45

暂无
暂无

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

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