我对R比较陌生,所以我的命令曲目有限。
我正在尝试编写一个脚本,它将分解一系列马尔可夫序列,包含在文本字符串中并用'>'分隔签署一个意外的“从 - 到”表。
带有虚拟数据的附加代码是我能够获取代码的地方。在包含的小案例中,这将相对较快地运行。但实际情况是,我有数百万个案例需要解析,而且我的代码不够有效,无法及时处理(它花费了一个多小时,这个时间框架不可行)。
我确信有一种更有效的方法来构造这段代码,以便它能够快速执行,因为我已经看到在几分钟内在其他Markov包中执行此操作。我需要自己的脚本版本,以便灵活处理,因此我没有转向这些。
我想要求的是改进脚本以提高处理效率。
Seq <- c('A>B>C>D', 'A>B>C', 'A', 'A', 'B', 'B>D>C', 'D') #7 cases
Lives <- c(0,0,0,0,1,1,0)
Seqdata <- data.frame(Seq, Lives)
Seqdata$Seq <- gsub("\\s", "", Seqdata$Seq)
fromstep <- list()
tostep <- list()
##ORDER 1##
for (x in 1:nrow(Seqdata)) {
steps <- unlist(strsplit(Seqdata$Seq[x], ">"))
for (i in 1:length(steps)) {
if (i==1) {fromstep <- c(fromstep, "Start")
tostep <- c(tostep, steps[i])
}
fromstep <- c(fromstep, steps[i])
if (i<length(steps)) {
tostep <- c(tostep, steps[i+1])
} else if (Seqdata$Lives[x] == 1) {
tostep <- c(tostep, 'Lives')
} else
tostep <- c(tostep, 'Dies')
}
}
transition.freq <- table(unlist(fromstep), unlist(tostep))
transition.freq
答案 0 :(得分:2)
我不熟悉马尔可夫序列,但这会产生相同的输出:
xx <- strsplit(Seqdata$Seq, '>', fixed=TRUE)
table(From=unlist(lapply(xx, append, 'Start', 0L)),
To=unlist(mapply(c, xx, ifelse(Seqdata$Lives == 0L, 'Dies', 'Lives'))))