通过匹配正则表达式将字符串分解为组件
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
中的 rleid
或 rle
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"
更新问题
我有这个字符向量
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
rleid
或 rle
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"