2016-07-22 56 views
2

(高中表格),這是我的原始數據的子集,我有工作:一天的時間減去:列

dput(datumi) 
structure(c("21:26", "21:33", "21:38", "23:02", "23:03", "21:27", 
"21:34", "21:39", "23:03", "23:04", "21:26", "21:33", "21:38", 
"23:02", "23:04", "21:26", "21:34", "21:38", "23:02", "23:04", 
"21:27", "21:34", "21:39", "23:02", "23:04"), .Dim = c(5L, 5L 
), .Dimnames = list(c("2", "3", "4", "5", "6"), c("Datum_1", 
"Datum_2", "Datum_3", "Datum_4", "Datum_5"))) 

所以我有時間,例如在那裏工作,21:26意味着時間的一天。

現在我想從第一個和第二從等第三減去第二列中,這意味着,我會從Datum_2Datum_4Datum_3減去Datum_1Datum_2柱和柱Datum_3我的輸出將是新的列與

我已經創建函數/循環,這是否在幾秒鐘的差別,如果我的數據會numeric,因此,例如在數字數據的情況下,我會做到這一點,得到了所需的輸出:

dat <- data.frame(
    column1 = round(runif(n = 10, min=0, max=5),0), 
    column2 = round(runif(n = 10, min=0, max=5),0), 
    column3 = round(runif(n = 10, min=0, max=5),0), 
    column4 = round(runif(n = 10, min=0, max=5),0) 
) 

results <- list() 
for(i in 1:length(dat)) { 
    if (i==length(dat)){ 
    results[[i]] <-dat[,i] 
    } else {results[[i]] <-dat[,i+1] - dat[,i]} 
} 

results <- t(do.call(rbind,results)) 
results <- data.frame(results) 

但我想不出它的時間格式,我曾嘗試strptimeas.POSIXct

x1 <- strptime(datumi, "%H:%M") 
as.numeric(x1,units="secs") 

as.POSIXct(datumi,format="%H:%M") 

而且還搜索這

Subtract time in r

Subtracting Two Columns Consisting of Both Date and Time in R

convert character to time in R

回答

2

這裏是基於R: Convert hours:minutes:seconds給出的answer一個解決方案。

datumi 
# Datum_1 Datum_2 Datum_3 Datum_4 Datum_5 
# 2 "21:26" "21:27" "21:26" "21:26" "21:27" 
# 3 "21:33" "21:34" "21:33" "21:34" "21:34" 
# 4 "21:38" "21:39" "21:38" "21:38" "21:39" 
# 5 "23:02" "23:03" "23:02" "23:02" "23:02" 
# 6 "23:03" "23:04" "23:04" "23:04" "23:04" 

makeTime <- function(x) as.POSIXct(paste(Sys.Date(), x)) 
dat <- apply(datumi, 2, makeTime) 
mapply(x = 2:ncol(dat), 
     y = 1:(ncol(dat) -1), 
     function(x, y) dat[ , x] - dat[ , y]) 
#  [,1] [,2] [,3] [,4] 
# [1,] 60 -60 0 60 
# [2,] 60 -60 60 0 
# [3,] 60 -60 0 60 
# [4,] 60 -60 0 0 
# [5,] 60 0 0 0 

您還可以使用as.POSIXct不與「格式」的說法粘貼當前數據:

makeTime <- function(x) as.POSIXct(x, format = "%H:%M") 

注意,結果是一樣的,因爲as.POSIXct假設給出無噹噹前的日期。

1

的一種方式,你也可以做,如果你想有列名的除了你的原始數據是做:

df<-as.data.frame(lapply(dat,strptime,format="%H:%M")) 
lapply(1:4, function(i) df[,paste0("diff",i,"_",i+1)] <<- difftime(df[,i],df[,i+1],units=c("secs"))) 

df 
       Datum_1    Datum_2    Datum_3    Datum_4    Datum_5 diff1_2 diff2_3 diff3_4 
2 2016-07-22 21:26:00 2016-07-22 21:27:00 2016-07-22 21:26:00 2016-07-22 21:26:00 2016-07-22 21:27:00 -60 secs 60 secs 0 secs 
3 2016-07-22 21:33:00 2016-07-22 21:34:00 2016-07-22 21:33:00 2016-07-22 21:34:00 2016-07-22 21:34:00 -60 secs 60 secs -60 secs 
4 2016-07-22 21:38:00 2016-07-22 21:39:00 2016-07-22 21:38:00 2016-07-22 21:38:00 2016-07-22 21:39:00 -60 secs 60 secs 0 secs 
5 2016-07-22 23:02:00 2016-07-22 23:03:00 2016-07-22 23:02:00 2016-07-22 23:02:00 2016-07-22 23:02:00 -60 secs 60 secs 0 secs 
6 2016-07-22 23:03:00 2016-07-22 23:04:00 2016-07-22 23:04:00 2016-07-22 23:04:00 2016-07-22 23:04:00 -60 secs 0 secs 0 secs 
    diff4_5 
2 -60 secs 
3 0 secs 
4 -60 secs 
5 0 secs 
6 0 secs 
0

我找到解決我的問題,包括功能/循環,我「VE數值數據創建的,我只是需要包括

difftime(strptime(datumi[,i+1], format = "%H:%M"), strptime(datumi[,i], format = "%H:%M"), units = "secs")我對循環功能,使代碼看起來像這樣

datumi <- as.data.frame(datumi) 
results <- list() 
for(i in 1:length(dat)) { 
    if (i==length(dat)){ 
    results[[i]] <-NULL 
    } else {results[[i]] <-difftime(strptime(datumi[,i+1], format = "%H:%M"), strptime(datumi[,1], format = "%H:%M"), units = "secs")    } 
} 

results <- t(do.call(rbind,results)) 
results <- data.frame(results) 

#And output 
    X1 X2 X3 X4 
2 60 0 0 60 
3 60 0 60 60 
4 60 0 0 60 
5 60 0 0 0 
6 60 60 60 60 

但由於@dayne使用的對我來說更方便(因爲它將函數應用於多個列表參數,並且對我更具可讀性),我使用了他的解決方案。