[英]How to calculate mean of two timestamp columns in R?
我在R中有數據框,其中兩列是日期時間(POSIX類)。 我需要按每一行計算平均日期時間。
這是一些可重現的示例:
a <- c(
"2018-10-11 15:22:17",
"2018-10-10 16:30:37",
"2018-10-10 16:52:46",
"2018-10-10 16:58:33",
"2018-10-10 16:32:24")
b <- c(
"2018-10-11 15:25:12",
"2018-10-10 16:30:39",
"2018-10-10 16:55:14",
"2018-10-10 16:58:53",
"2018-10-10 16:32:27")
a <- strptime(a, format = "%Y-%m-%d %H:%M:%S")
b <- strptime(b, format = "%Y-%m-%d %H:%M:%S")
f <- data.frame(a, b)
結果應該是這樣的:
a b time_mean
1 2018-10-11 15:22:17 2018-10-11 15:25:12 2018-10-11 15:23:44
2 2018-10-10 16:30:37 2018-10-10 16:30:39 2018-10-10 16:30:38
3 2018-10-10 16:52:46 2018-10-10 16:55:14 2018-10-10 16:54:00
4 2018-10-10 16:58:33 2018-10-10 16:58:53 2018-10-10 16:58:43
5 2018-10-10 16:32:24 2018-10-10 16:32:27 2018-10-10 16:32:25
我嘗試了以下操作:
apply(f, 1, function(x) mean)
apply(f, 1, function(x) mean(c(x[1], x[2])))
與其使用apply
(可以將其轉換為matrix
然后剝離class
屬性),不如使用Map
f$time_mean <- do.call(c, Map(function(x, y) mean(c(x, y)), a, b))
f$time_mean
#[1] "2018-10-11 15:23:44 EDT" "2018-10-10 16:30:38 EDT" "2018-10-10 16:54:00 EDT" "2018-10-10 16:58:43 EDT"
#[5] "2018-10-10 16:32:25 EDT"
或者是從data.frame
f
do.call(c, Map(function(x, y) mean(c(x, y)), f$a, f$b))
另外,另一個選擇是使用?xtfrm
(也具有POSIXlt
方法分派)轉換為numeric
類,執行rowMeans
並轉換為DateTime類,如@ jay.sf的文章
as.POSIXlt(rowMeans(sapply(f, xtfrm)), origin = "1970-01-01")
#[1] "2018-10-11 15:23:44 EDT" "2018-10-10 16:30:38 EDT" "2018-10-10 16:54:00 EDT" "2018-10-10 16:58:43 EDT"
#[5] "2018-10-10 16:32:25 EDT"
您可以使用數字進行計算。
f$time_mean <- as.POSIXct(sapply(seq(nrow(f)), function(x)
mean(as.numeric(f[x, ]))), origin="1970-01-01")
f
# a b time_mean
# 1 2018-10-11 15:22:17 2018-10-11 15:25:12 2018-10-11 15:23:44
# 2 2018-10-10 16:30:37 2018-10-10 16:30:39 2018-10-10 16:30:38
# 3 2018-10-10 16:52:46 2018-10-10 16:55:14 2018-10-10 16:54:00
# 4 2018-10-10 16:58:33 2018-10-10 16:58:53 2018-10-10 16:58:43
# 5 2018-10-10 16:32:24 2018-10-10 16:32:27 2018-10-10 16:32:25
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.