r - 将事件开始和结束时间转换为 R dplyr/tidyr 中多个组的分箱数据

标签 r performance dplyr binning

我的数据看起来像这样:

foo <- data.frame(userid = c("a","a","b","b","b"),
                  activity = factor(c("x","y","z","z","x")),
                  st=c(0, 20,   0, 10, 25), # start time
                  et=c(20, 30, 10, 25, 30)) # end time

我希望对于每个用户 ID,将事件数据转换为五分钟的时间段。结果看起来像这样:

result <- data.frame(userid = c("a", "b"),
                         x1 = c("x", "z"),
                         x2 = c("x", "z"),
                         x3 = c("x", "z"),
                         x4 = c("x", "z"),
                         x5 = c("y", "z"),
                         x6 = c("y", "x"))

下面的方法是可行的,但是相当麻烦而且速度很慢。对于我的中等大小的数据集,这大约需要 15 分钟。

library(dplyr)
library(tidyr)

lvls <- levels(foo$activity)

time_bin <- function(st, et, act) {
  bins <- seq(0, 30, by=5)
  tb <- as.integer(bins>=st & bins<et)*as.integer(act)
  tb[tb>0] <- lvls[tb]
  data.frame(tb=tb, bins=bins)
}

new_foo <- 
  foo %>% 
  rowwise() %>%
  do(data.frame(., time_bin(.$st, .$et, .$activity))) %>%
  select(-(activity:et)) %>%
  group_by(userid) %>%
  subset(tb>0) %>%
  spread(bins, tb)

有没有更快或更方便的方法来解决这个问题?

最佳答案

你可以尝试:

library(data.table)
library(reshape2)

dt = setDT(foo)[,seq(min(st)+5,max(et),5),.(userid,activity)]
dcast(dt, userid~V1, value.var='activity')
#  userid 5 10 15 20 25 30
#1      a x  x  x  x  y  y
#2      b z  z  z  z  z  x

关于r - 将事件开始和结束时间转换为 R dplyr/tidyr 中多个组的分箱数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29553206/

相关文章:

r - ggplot2 geom_rect 图四分位数堆叠数据点和离散 x 轴

在 IN 子句中使用嵌套表的性能 - Oracle

r - 排序数据保持不同类型首次出现的原始相对位置

r - 收集 R 中相同组内的重叠坐标列

r - 如何将具有特定模式的字符串与字符向量中的前一个字符串连接起来?

r - R中数据框的2个相邻行中的字符串比较

从宏 (Excel) 运行 R 脚本

r - 消除一个轴上的strip.background(ggplot2)

C++速度比较迭代器与索引

python - 为什么 numpy.where 比替代方案快得多