更新问题
我有这个字符向量
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,请使用 rleid
或 rle
中的 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/