通过匹配正则表达式将字符串分解为组件

Break character string into components by matching regex

更新问题

我有这个字符向量

str_ <- "H3K9me0S10ph1K14ac1me0"

我想把它分成几块,这样我得到的输出如下:

"H3K9: me0 | S10: ph1 | K14: ac1,me0"

最好以利用 {dplyr} 的方式完成此操作,这样我就可以对 tibble 执行此操作并获得具有所需字符串输出的新列。有什么想法吗?

正如以下部分所建议的,我正在努力获得一个 table 来表示哪些修改与什么配对,例如me0 与 H3K9 一起使用,而 ac1、me0 与 K14

一起使用

任何帮助都会很有帮助!

多次尝试

使用一个稍微不同的例子,

str_ <- "H3K9ac1K14ac1K18ac1me0"

所以我尝试通过提取所有“me[0-9]*”或“ac[0-9]*”等将字符向量分解成多个部分,然后给它们一个与其索引相对应的 id在字符向量中。

# A tibble: 4 x 2
      i m    
  <int> <chr>
1    12 ac1  
2    17 ac1  
3    23 ac1  
4    26 me0 

我需要一种方法来创建一个列 together 来判断两个修饰是否属于同一个蛋白质,即在这个例子中 K14 有 ac1 和 me0,所以它们的 'together' 值应该是 'TRUE'.我试过使用它们的指数之间的距离作为团结的替代品,但我认为这不是最好的方法:

# A tibble: 4 x 2
      i m     unit_diff  together
  <int> <chr>    <int>     <lgl>
1    12 ac1       0          FALSE
2    17 ac1       5          FALSE
3    23 ac1       6          TRUE
4    26 me0       3          TRUE

有什么想法吗?我试过使用模 3,但这似乎不能一概而论。这甚至是正确的方法吗?我乐于接受建议

使用diff创建'unit_diff'然后使用%%

library(dplyr)
df1 %>% 
   mutate(unit_diff = c(0, diff(i)),
    together = unit_diff %% 3 == 0 & unit_diff != 0)

-输出

# A tibble: 4 × 4
      i m     unit_diff together
  <dbl> <chr>     <dbl> <lgl>   
1    12 ac1           0 FALSE   
2    17 ac1           5 FALSE   
3    23 ac1           6 TRUE    
4    26 me0           3 TRUE    

如果我们要检查 n 个值的相邻值是否为真,请使用 base R

中的 rleidrle
library(data.table)
n <- 2
df1 %>% 
   mutate(unit_diff = c(0, diff(i)),
    together = unit_diff %% 3 == 0 & unit_diff != 0) %>%
   group_by(grp = rleid(together)) %>%
   mutate(together = all(together) &  n() == n) %>%
   ungroup %>%
   select(-grp)

对于第二个更新的问题,我们可以使用正则表达式插入一些分隔符 - 即最初,我们捕获一个或多个非小写字母的字符 (([^a-z]+)) 并替换为捕获组的反向引用后跟:\1:),然后,我们在小写字母后跟数字和大写字母的字符之间插入|,去掉后面的: trimws 结尾,最后将 : 替换为 , 之间的一个或多个小写字母后跟一个或多个数字

gsub("([a-z]+\d+):", "\1,",
  trimws(gsub("(?<=[a-z][0-9])(?=[A-Z])", " | ", 
 gsub("([^a-z]+)", "\1: ", str_), perl = TRUE), whitespace = ":\s+"))
[1] "H3K9: me0 | S10: ph1 | K14: ac1, me0"

数据

df1 <- structure(list(i = c(12, 17, 23, 26), m = c("ac1", "ac1", "ac1", 
"me0")), class = c("tbl_df", "tbl", "data.frame"), 
row.names = c(NA, 
-4L))

我为你的输出写了一个小函数:注意我写函数不是很有经验!

str_ <- "H3K9me0S10ph1K14ac1me0"


library(stringr)
library(knitr)

clean_func <- function(str_, x, y) {

x <- str_extract_all(str_, '([a-z]+[0-9]+)')[[1]]
y <- strsplit(str_replace_all(str_, paste(x, collapse = '|'), ' '), ' ')[[1]]
x[3] <- knitr::combine_words(x[3:4], and=",")
x1 <- x[1:3]
y1 <- y[1:3]
result <- paste(paste(y1, x1, sep = ": "), collapse = " | ")
return(result)
}

clean_func(str_)
[1] "H3K9: me0 | S10: ph1 | K14: ac1,me0"