【问题标题】:R multiple columns group byR多列分组
【发布时间】:2015-07-16 00:52:06
【问题描述】:

我有一个数据集x_output,如下所示:

          timestamp   city wait_time weekday
2015-07-14 09:00:00 Boston       1.4 Tuesday
2015-07-14 09:01:00 Boston       2.5 Tuesday
2015-07-14 09:02:00 Boston       2.8 Tuesday
2015-07-14 09:03:00 Boston       1.6 Tuesday
2015-07-14 09:04:00 Boston       1.5 Tuesday
2015-07-14 09:05:00 Boston       1.4 Wednesday

我想找到平均 wait_time,按 cityweekdaytime 分组。基本上,给定您所在的城市,例如,星期一的平均等待时间是多少?然后星期二?

我在创建time 列给定x_output$timestamp 时遇到困难;我目前正在使用:

x_output$time <- strsplit(as.character(x_output$timestamp), split = " ")[[1]][2]

但是,这只是将“09:00”放在每一行中,而不是每一行的正确时间。

其次,我需要有一个 3 路分组来找到给定城市、工作日和时间的平均 wait_time。这是在 python pandas 中相当简单的事情,但我可以在 R 中找到很少的文档(不幸的是我需要在 R 中,而不是 python)。

我已经研究过使用data.table,但这似乎不起作用。有没有像 python pandas 中那样的简单函数(例如df.groupby(['col1', 'col2', 'col3']).mean())?

【问题讨论】:

  • 类似于df %&gt;% group_by(city, weekday) %&gt;% mutate(MeaD = mean(wait_time))dplyr 但请发布有用的代码。您的代码只有NAs 的等待时间,只有一个城市,只有一天。有了这个日期是不可能帮助你的。
  • 对不起!现在修好了。我很快就会对此进行测试。
  • 应该更像sapply(strsplit(as.character(x_output$timestamp), split = " "),'[',2) 从列表中的每个向量中提取第二个元素。
  • timestamp 分组的标准是什么?每天?每12小时?每周?
  • 还有一件事:你在问 3 件事(有点不相关),而标题只是关于分组数据。也许您最好打开另一个关于如何将timestamp 列解析为日期和时间的问题(或进行搜索)。

标签: r group-by transform shiny strsplit


【解决方案1】:

平均 wait_time 按城市、工作日、时间分组:

library(plyr)
ddply(x_output, .(city, weekday, time), summarize, avg=mean(wait_time))

如果你想要data.table

x_output[, list(avg=mean(wait_time)), .(city, weekday, time)]

在给定x_output$timestamp 的情况下,我很难创建time

那么,time 列应该包含什么?只是timestamp 的时间部分? timestamp 是 POSIXct 还是字符串?

如果是POSIXct,那么你可以直接转换成字符,指定时间格式:

x_output$time <- as.character(x_output$timestamp, '%H:%M')
# or as.factor(as.character(...)) if you need it to be a factor.
# in data.table: x[, time:=as.character(timestamp, '%H:%M')]

这将使time 列成为带有小时和分钟的字符串。有关将该日期时间转换为字符串的更多选项(例如,如果您想包含秒数),请参阅 ?strptime

如果是字符串,可以strsplit并提取第二个组件:

vapply(strsplit(x_output$timestamp, ' '), '[', i=2, 'template')

这将为您提供“HH:MM:SS”作为您的时间格式。如果您想做自定义时间格式,最好将您的 timestamp 字符串转换为 POSIXct 并返回到已经提到的特定格式。

【讨论】:

  • 时间戳 -> 时间完美。我为多个 groupby 尝试了这两种方法。使用ddplyr,我收到了Error in attributes(out) &lt;- attributes(col) : 'names' attribute [11] must be the same length as the vector [1]。使用 data.table,我收到了Error in drop &amp;&amp; !has.j : invalid 'x' type in 'x &amp;&amp; y'。我的 colclasses 是(POSIXlt、因子、数字、字符、字符)。
  • 在这种情况下,您必须提供可重现的示例。您在问题中提供的数据适用于我提供的代码,但每个城市和时间只有一条记录。
  • 我觉得从我的工作计算机随机连接到一个神秘的 IP 有点不确定(我无论如何都尝试过,但它超时了 - 可能是防火墙)。在任何情况下,问题似乎都与您的特定数据有关,因此如果其中有错误,您必须缩小范围。
  • 好的,如果我不能让它工作,我会尽快调查或将 .csv 发布到其他地方。
  • 当我试图弄清楚这一点时,这是迄今为止的数据集和代码:github.com/alexpetralia/RMV_wait_times
猜你喜欢
  • 2015-12-02
  • 1970-01-01
  • 2017-05-09
  • 2020-04-23
  • 1970-01-01
  • 1970-01-01
  • 2021-12-24
  • 1970-01-01
  • 2021-05-16
相关资源
最近更新 更多