R - 优化长表格式的循环操作

时间:2016-05-07 15:37:24

标签: r optimization foreach dplyr

我有一个包含以下格式的大约120万行的长格式表数据

+-----------+-------+
| ProcessId | Event |
+-----------+-------+
|       111 | A     |
|       111 | B     |
|       111 | C     |
|       111 | D     |
|       111 | E     |
|       112 | A     |
|       112 | B     |
|       112 | D     |
|       112 | E     |
|       113 | A     |
|       113 | B     |
|       113 | C     |
|       113 | D     |
|       113 | E     |
+-----------+-------+

事件已按时间戳排序,我想为每个进程ID生成从长格式表到单独列到另一个表的进程流字符串,如下所示

处理流程< - (' A-> B-> C-> D-> E' A-> B-> D-> E& #39;,' A-> B-> C-> D-> E',...等)

我尝试了下面的代码行。但是他们每个人在我的核心i3,4GB RAM笔记本电脑上花费了近850秒。有什么方法可以更快地完成这项工作? 任何指导都会有所帮助

使用dplyr软件包的版本1

state_flow_identifier <- function(x){
y <-filter(data_longformat,process_id==x)
y_v <- as.vector(y$Event)
as.character(paste(y_v,collapse = '->'))
}

processflow_detection <- mutate(processflow_detection,processflow = apply(processflow_detection['process_id'],1,function(x)state_flow_identifier(x)))

使用foreach包的版本2

processflow <- foreach(i=processflow_detection$process_id,.combine='c') %do% state_flow_identifier(i)

感谢。

3 个答案:

答案 0 :(得分:2)

您还应该查看data.table的效率,(使用@ Gopala的数据框)

library(data.table)
setDT(df)[, .(event_flow = paste(Event, collapse = '->')), by = ProcessId]
#   ProcessId    event_flow
#1:       111 A->B->C->D->E
#2:       112 A->B->C->D->E
#3:       113 A->B->C->D->E

答案 1 :(得分:1)

您可以使用$query['q'] = "name contains " . implode(" and name contains ", $array); dplyr函数尝试此类操作:

group_by

输出如下:

library(dplyr)
df %>%
  group_by(ProcessId) %>%
  summarise(eventFlow = paste(Event, collapse = ' -> '))

注意,我使用此数据框作为输入,因为您的格式不是输入R:

Source: local data frame [3 x 2]

  ProcessId             eventFlow
      (dbl)                 (chr)
1       111 A -> B -> C -> D -> E
2       112 A -> B -> C -> D -> E
3       113 A -> B -> C -> D -> E

答案 2 :(得分:0)

您不需要任何库。

df <- data.frame(ProcessId=c(rep(111,5),rep(112,4),rep(113,5)),Event=unlist(strsplit("ABCDEABDEABCDE","")))
len <- nrow(df)
new_process_id <- c(TRUE, df$ProcessId[-len] != df$ProcessId[-1])
sym <- rep(" -> ", len)
sym[new_process_id] <- ","
str <- paste(sym, df$Event, sep="", collapse="")
data.frame(ProcessId=rle(df$ProcessId)$val,EventFlow=unlist(strsplit(str,","))[-1])

输出:

  ProcessId             EventFlow
1       111 A -> B -> C -> D -> E
2       112      A -> B -> D -> E
3       113 A -> B -> C -> D -> E

对于1.25万行,我的笔记本电脑上的执行时间约为2秒