R加速字符串分解

时间:2016-06-08 10:48:38

标签: r processing-efficiency markov-chains

我对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

1 个答案:

答案 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'))))