时间平均值 - hh:mm:ss - 按变量分组

时间:2013-12-11 17:48:50

标签: r dataframe statistics mean hour

需要按国家/地区计算时间的平均值。时间是日期变量 - hh:mm:ss

此命令with(df,tapply(as.numeric(times(df$Time)),Country,mean)) 没有在 hh:mm:ss 中返回正确的均值。

    Country Time
1   Germany 2:26:21
2   Germany 2:19:19
3   Brazil  2:06:34
4   USA     2:06:17
5   Eth     2:18:58
6   Japan   2:08:35
7   Morocco 2:05:27
8   Germany 2:13:57
9   Romania 2:21:30
10  Spain   2:07:23

输出:

>with(df,tapply(as.numeric(times(df$Time)),Country,mean))
      Andorra     Australia        Brazil        Canada         China 
   0.09334491    0.09634259    0.09578125    0.09634645    0.09481192 
      Eritrea      Ethiopia        France       Germany Great Britain 
   0.09709491    0.09010031    0.10025463    0.09713349    0.09524306 
      Ireland         Italy         Japan         Kenya       Morocco 
   0.09593750    0.09520255    0.09579630    0.08934854    0.09400463 
   New Zeland          Peru        Poland       Romania        Russia 
   0.09664931    0.09809606    0.09638889    0.09875000    0.09327932 
        Spain   Switzerland        Uganda United States      Zimbabwe 
   0.09314236    0.09620949    0.10068287    0.09399016    0.09892940 

2 个答案:

答案 0 :(得分:2)

我发现你已经发现了在R ...中使用日期和时间值的痛苦。

这是你的想法吗?

df$nTime <- difftime(strptime(df$Time,"%H:%M:%S"),
                     strptime("00:00:00","%H:%M:%S"),
                     units="secs")
df.means <- aggregate(df$nTime,by=list(df$Country),mean)
df.means$Time <- format(.POSIXct(df.means$x,tz="GMT"), "%H:%M:%S")
df.means
  Group.1         x     Time
# 1  Brazil 7594.000  02:06:34
# 2     Eth 8338.000  02:18:58
# 3 Germany 8392.333  02:19:52
# 4   Japan 7715.000  02:08:35
# 5 Morocco 7527.000  02:05:27
# 6 Romania 8490.000  02:21:30
# 7   Spain 7643.000  02:07:23
# 8     USA 7577.000  02:06:17

第一行添加一列nTime,这是从午夜开始的时间(以秒为单位)。 第二行计算平均值。 第三行转换回H:M:S。

您遇到的问题是strptime(...),当被迫转换为数字时,会返回1970-01-01与指定时间之间的秒数。所以,一个非常大的数字。此代码只是从今天的1970-01-0100:00:00中减去秒数。

答案 1 :(得分:1)

你是否想要这样做 -

dades$Time <- strptime(dades$Time,'%H:%M:%S')
by(dades$Time, dades$Country, mean)

如果我不明白你的问题,请你发表样本输出。