UPDATED QUESTION

我有这个特征向量

str_ <- "H3K9me0S10ph1K14ac1me0"

我想把它分成几部分,这样我就能得到如下输出:

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

最好是以利用{dplyr}的方式完成,这样我就可以在一个tible上执行这个操作,并获得一个具有所需字符串输出的新列.有什么 idea 吗?

正如以下部分所示,我很难得到一个表,表明哪些修改与什么匹配,例如me0与H3K9匹配,ac1和me0与K14匹配

任何帮助都会很有帮助!

Pieces of attempts

用一个稍微不同的例子,

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,所以它们的"一起"值应该是"真".我试着用他们指数之间的距离来代替团结,但我不认为这是最好的方法:

# 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

有什么 idea 吗?我试过使用模3,但这似乎不能推广.这是正确的方法吗?我愿意接受建议

推荐答案

使用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(数据.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", "数据.frame"), 
row.names = c(NA, 
-4L))

R相关问答推荐

使用预定值列表将模拟数量(n)替换为rnorm()

具有多个依赖变量/LHS的逻辑模型

获取一个数据库框架的摘要,该数据库框架将包含一列数据库框架,

将数据集中的值增加到当前包含的最大值

在R中使用数据集名称

在R中无法读入具有Readxl和lApply的数据集

标识R中多个列中缺少的唯一值

如何在观测缺失的地方添加零

从一个列表的框架中移除列表包装器

在使用tidyModels和XGBoost的二进制分类机器学习任务中,所有模型都失败

如何在PackageStatus()中列出&q;不可用的包&q;?

基于Key->Value数据帧的基因子集相关性提取

如何将这个小列表转换为数据帧?

将列的值乘以在不同数据集中找到的值

用多边形替换地块点

是否有可能从边界中找到一个点值?

希望解析和复制R中特定模式的数据

如何使用list_rind在列表中保留已命名但不包含第0行的记录?

将每晚的平均值与每晚的值进行比较,统计是否有效?

R代码来迭代列表,将它们组合成一个带有分组变量的数据框?