2015-08-17 31 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