我有一个包含以下格式的大约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)
感谢。
答案 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秒