【问题标题】:Counting consecutive patterns in strings using R使用 R 计算字符串中的连续模式
【发布时间】:2015-12-01 15:11:52
【问题描述】:

我正在尝试编写一个函数来计算模式的连续实例数。例如,我想要字符串

string<-"A>A>A>B>C>C>C>A>A"

变身

"3 A > 1 B > 3 C > 2 A"

我有一个计算每个字符串实例的函数,见下文。但它并没有达到我想要的排序效果。任何想法或指示?

谢谢,

R

现有功能:

fnc_gen_PathName <- function(string) {
p <- strsplit(as.character(string), ";")
p1 <- lapply(p, table)
p2 <- lapply(p1, function(x) {
sapply(1:length(x), function(i) {
  if(x[i] == 25){
    paste0(x[i], "+ ", names(x)[i])
  } else{
    paste0(x[i], "x ", names(x)[i])
  }
})
})
p3 <- lapply(p2, function(x) paste(x, collapse = "; "))
p3 <- do.call(rbind, p3)
return(p3)
}

【问题讨论】:

  • 你看过rle()函数吗?如果您将字符串拆分为向量,应该可以正常工作。
  • 完美,非常感谢。以前从未听说过该功能,但非常易于使用。

标签: r stringr


【解决方案1】:

正如@MrFlick 所说,您可以使用rlestrsplit 尝试以下操作

with(rle(strsplit(string, ">")[[1]]), paste(lengths, values, collapse = " > "))
## [1] "3 A > 1 B > 3 C > 2 A"

【讨论】:

    【解决方案2】:

    这里有两种 dplyr 解决方案:一种是常规的,一种是带有 rle 的。优点是:可以输入多个字符串作为向量,在重新嵌套之前构建一个整洁的中间数据集。

    library(dplyr)
    library(tidyr)
    library(stringi)
    
    strings = "A>A>A>B>C>C>C>A>A"
    
    
    data_frame(string = strings) %>%
      mutate(string_split =
               string %>%
               stri_split_fixed(">")) %>%
      unnest(string_split) %>%
      mutate(ID = 
               string_split %>%
               lag %>%
               `!=`(string_split) %>%
               plyr::mapvalues(NA, TRUE) %>%
               cumsum) %>%
      count(string, ID, string_split) %>%
      group_by(string) %>%
      summarize(new_string =
                  paste(n, 
                        string_split, 
                        collapse = " > ") )
    
    data_frame(string = strings) %>%
      group_by(string) %>%
      do(.$string %>%
           first %>%
           stri_split_fixed(">") %>%
           first %>%
           rle %>%
           unclass %>%
           as.data.frame) %>%
      summarize(new_string = 
                  paste(lengths, values, collapse = " > "))
    

    【讨论】:

      猜你喜欢
      • 2018-11-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多