2015-08-17 32 views
1

我想通過一個因子變量求和一組POSIXct對象,但得到的錯誤不是爲POSIXt對象定義sum。然而,如果我只是計算平均值,它工作得很好。但是,我怎樣才能通過使用tapply的小組得到總結時間?R:使用tapply求和POSIXct對象

實施例:

data <- data.frame(time = c("2:50:04", "1:24:10", "3:10:43", "1:44:26", "2:10:19", "3:01:04"), 
        group = c("A","A","A","B","B","B")) 
data$group <- as.factor(data$group) 
data$time <- as.POSIXct(paste("1970-01-01", data$time), format="%Y-%m-%d %H:%M:%S", tz="GMT") 

# works 
tapply(data$time, data$group, mean) 

# doesn't work 
tapply(data$time, data$group, sum) 
+1

試試'tapply(data $ time,data $ group,function(x)sum(as.nume ric(x)))' –

+0

太棒了,這是我所希望的一種簡單的解決方法。只需要轉換回h:m:s格式,這非常簡單。謝謝! – ageil

回答

1

日期對象不能被求和,這並語義沒有意義時,操作者+也沒有爲POSIXct對象中定義。

也許你想模擬時差並總結它們?

嘗試:

times <- as.difftime(c("2:50:04", "1:24:10", "3:10:43", 
         "1:44:26", "2:10:19", "3:01:04"), "%H:%M:%S") 
sum(times) 

一個difftime對象也是,當你減去兩個日期對象,你會得到什麼(這是語義上合理的)。

編輯:

在語義上更合適的方法用於有機磷農藥問題的全部溶液(tapply接縫破壞difftime類的結構 - 使用group_by從dplyr包代替)

library(dplyr) 

times <- as.difftime(c("2:50:04", "1:24:10", "3:10:43", 
         "1:44:26", "2:10:19", "3:01:04"), format="%H:%M:%S") 

data <- data.frame(time = times, group = c("A","A","A","B","B","B")) 

summarise(group_by(data, group), sum(time)) 

這給出了以下輸出:

Source: local data frame [2 x 2] 

    group  sum(time) 
1  A 7.415833 hours 
2  B 6.930278 hours 
+0

嗯,你的代碼看起來似乎提供了我以後的,但我不確定我完全理解POSIXct和difftime之間的區別。你能告訴我這將如何在原始的POSIXct數據中實現嗎? – ageil

+0

謝謝,你的編輯幫助我理解了很多。雖然我認爲tapply仍然可以在不涉及dplyr的情況下工作,如果我以difftime格式製作時間變量的副本。然後'tapply(時間,數據$組,總和)'應該提供相同的結果。編輯:它的確如此,所以我將問題標記爲已解決。 – ageil