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

标签 r regex dplyr tidyverse

更新问题

我有这个字符向量

str_ <- "H3K9me0S10ph1K14ac1me0"

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

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

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

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

任何帮助都会很有帮助!

一些尝试

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

str_ <- "H3K9ac1K14ac1K18ac1me0"

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

# 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 值相邻的 TRUE,请使用 rleidrle 中的 base R

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))

关于r - 通过匹配正则表达式将字符串分解为组件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/71990922/

相关文章:

xml - R:将 XML 数据转换为数据框

R Shiny map 搜索输入框

python - 为什么 Python 正则表达式字符串有时可以在不使用原始字符串的情况下工作?

r - 基于相邻列最大值的值

r - 在 R 中读取 XML 时编码丢失

R For Loop无法存储数据

r - 从两个数据框中获取组匹配,保持 R 中的行顺序

r - `write.dbf` 因类 `tbl_df` 的对象而失败

regex - 如何在 Perl 中匹配多个正则表达式?

java - 如果Java中的字符串以特殊字符开头,如何将第一个字母大写?