我的数据如下:
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
我希望每个日期组合之间的小时差异(理想情况下只是在时间上前进,即没有负差异)。我知道如何手动执行此操作(calculating number of days between 2 columns of dates in data frame):
df$Date2_Date1 <- difftime(df$Date2,df$Date1, units = c("hours"))
然而,我的真实数据框架要大得多,这将非常繁琐(但可能)。我已经阅读了这篇文章(Calculate pairwise-difference between each pair of columns in dataframe)和这篇文章(R: Compare all the columns pairwise in matrix),让我试着这样做:
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 ..
对此有什么好的解决方案吗?
答案 0 :(得分:3)
以这种方式,基于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