如何找到时间列的平均值并使用 r 对其进行分组?

问题描述 投票:0回答:2

我有一个数据框,其中包含名为ride_length 的列,该列已经采用 hh:mm:ss 格式。我想计算该列的平均值,并通过其两个类别对其进行分组:成员和休闲(在 member_casual 列中找到)。

我已经用 lubridate 库尝试过这个管道:

df %>%
  group_by(member_casual) %>%
  seconds_to_period(mean(period_to_seconds(hms(ride_length))))

即使我的论点与网上找到的其他示例相同,我仍然收到此消息:

seconds_to_period(.,mean(period_to_seconds(hms(ride_length))))中的错误: 未使用的参数(平均值(period_to_seconds(hms(ride_length))))

我还通过这样做尝试了更长的路径:

df$nride_length <- difftime(strptime(df$ride_length,"%H:%M:%S"),
                     strptime("00:00:00","%H:%M:%S"),
                     units="mins")
df.means <- aggregate(df$nride_length,by=list(df$member_casual),mean)
df.means$ride_length <- format(.POSIXct(df.means$x,tz="GMT"), "%H:%M:%S")
df.means

但结果还是有问题:

Group.1 xride_length 1 休闲 NA 分钟 2 名会员 NA 分钟

我也尝试过总结:

df %>%
  group_by(member_casual) %>%
  summarise(length_mean = seconds_to_period(mean(period_to_seconds(hms(ride_length)))))

但是这表明:

小标题:2×2

member_casual length_mean
1 休闲 NA
2 名成员 NA
警告信息:

summarise()
中有 2 个警告。 第一个警告是: ℹ 在争论中:
length_mean = seconds_to_period(mean(period_to_seconds(hms(ride_length))))
。 ℹ 第 1 组:
member_casual = "casual"
。 由
.parse_hms()
中的警告引起: !某些字符串解析失败,或者所有字符串都是 NA ℹ 运行 dplyr::last_dplyr_warnings() 以查看剩余的 1 个警告。

请帮忙

r dataframe time group-by lubridate
2个回答
0
投票

您可以单独使用

aggregate()
。像使用方差分析一样指定分组。我稍微改变了 data.frame,所以有“会员”和“休闲”三个。

dtf <- structure(list(rideable_type=c("electric_bike",
  "classic_bike", "classic_bike", "electric_bike",
  "classic_bike", "classic_bike"), day_of_week=c(1, 1, 1, 6, 7,
  2), ride_length=structure(c(990, 810, 576, 296, 686, 294),
  class=c("hms", "difftime"), units="secs"),
  member_casual=c("member", "member", "member", "casual",
  "casual", "casual"), nride_length=structure(c(16.5, 13.5, 9.6,
  4.93, 11.43, 4.9), class="difftime", units="mins")),
  row.names=c(NA, -6L), class=c("tbl_df", "tbl", "data.frame"))
    
aggregate(ride_length ~ member_casual, data=dtf, mean)
  #   member_casual    ride_length
  # 1        casual 425.33333 secs
  # 2        member 792.00000 secs


-1
投票

假设您的数据如下:

x <- c("09:10:01", "10:10:02", "09:40:03","07:10:16", "09:20:02", "08:52:10")
df <- data.frame(member_casual=c(rep('A',3),rep('B',3)),
                   ride_length=hms(x),stringsAsFactors = F)

df
  member_casual ride_length
1             A   9H 10M 1S
2             A  10H 10M 2S
3             A   9H 40M 3S
4             B  7H 10M 16S
5             B   9H 20M 2S
6             B  8H 52M 10S

我尝试了您上面尝试过的代码,它对我来说效果很好。

df %>%
   group_by(member_casual) %>%
   summarise(mean=seconds_to_period(mean(period_to_seconds(ride_length))))
# A tibble: 2 × 2
  member_casual mean                    
  <chr>         <Period>                
1 A             9H 40M 2S               
2 B             8H 27M 29.3333333333321S

所以请确认您的数据格式正确,尤其是名为“ride_length”的列,单独运行

hms(df$ride_length)
并检查它是否运行成功。

© www.soinside.com 2019 - 2024. All rights reserved.