我正在努力使答案适应我之前的问题(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))
由于
答案 0 :(得分:2)
鉴于你的例子,这应该是诀窍:
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")
&GT;日期2日期3
&GT; [1,] 4.763889 23.45
&GT; [2,] 4.763889 23.45
在我的通话中mapply
将函数difftime
应用于所提供的两个数组,因此它以df[, 4] - df[, 3]
开头,然后是df[, 5] - df[, 4]
。您当然必须使用日期的列号更改此值,并确保以正确的方式订购。
答案 1 :(得分:1)
您可以使用非标准评估:
首先,使用包含日期的列的名称创建一个字符向量。所以,让#39;说出所有以&#39;日期&#39;
开头的列dates = names(df)[grepl("^Date", names(df))]
我们创建一个动态计算相邻列之间差异的公式列表:
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"))
然后你可以使用dplyr的NSE mutate_来应用上面生成的动态公式:
df %>%
mutate_(.dots = setNames(all_operations, paste0("Diff", seq_len(length(dates) - 1))))