在数据帧的列中拆分字符串并使用拆分返回新列

时间:2015-04-04 18:51:00

标签: r

我有一个名为dat的数据框,它有两列,如下所示

col1   col2
chr2   atagaaaaatcggctgggtgcggtggctcactcctataatcccagcactttg
chr3   atagaaaaatcggctgggtgcggtggctcactcctataatcccagcactttg

我希望能够在gtggctc的匹配项中拆分字符串,并返回一个新列,其中包含的匹配项达到指定的长度(例如,如下所示10个字符

col1   col2                      new_split_col
chr2   atagaaaaatcggctgggtgcg    gtggctcactcctataa
chr3   atagaaaaatcggctgggtgcg    gtggctcactcctataa

我试过了

library(stringr)
dat$new_split_col <- str_split(dat$col2, "gtggctc", 2)

但它在一列中给了我两个匹配并且不包括匹配本身。它也不允许我指定所需匹配的长度。

1 个答案:

答案 0 :(得分:2)

尝试

library(stringr)
dat[c('col2', 'new_split_col')] <-  do.call(rbind,lapply(str_split(dat$col2,
     perl('(?=gtggctc)'), 2), function(x) c(x[1],substr(x[2],1,17))))

或者

library(tidyr)
extract(dat, col2, into=c('col2', 'new_split_col'), '(.*)(gtggctc.{10}).*')
#  col1                   col2     new_split_col
#1 chr2 atagaaaaatcggctgggtgcg gtggctcactcctataa
#2 chr3 atagaaaaatcggctgggtgcg gtggctcactcctataa

或者

dat[c('col2', 'new_split_col')] <- read.table(text=gsub('(.*)(gtggctc.{10}).*',
         '\\1 \\2', dat$col2))