R-正则表达式开始位置的索引,然后将其添加到字符串?

时间:2013-06-01 23:03:28

标签: regex string r indexing

到目前为止,我已经能够合并两个文件并获得以下数据帧(df1):

ID  someLength  someLongerSeq   someSeq someMOD someValue
A   16  XCVBNMHGFDSTHJGF    NMH T3(P)   7
A   16  XCVBNMHGFDSTHJGF    NmH M3(O); S4(P); S6(P) 1
B   24  HDFGKJSDHFGKJSDFHGKLSJDF    HFGKJSDFH   S9(P)   5
C   22  QIOWEURQOIWERERQWEFFFF  RQoIWERER   Q16(D); S19(P)  7
D   19  HSEKDFGSFDKELJGFZZX KELJ    S7(P); C9(C); S10(P)    1

我正在寻找一种基于“someSeq”列进行正则表达式匹配的方法,以在“someLongersSeq”列中查找该子字符串并获取匹配的起始位置,然后将其添加到附加的整数中对T3(P)这样的人物。

Example:

对于第二行"ID:A","someSeq":"NmH"匹配从someLongerSeq的位置4开始(在NmH的上转换之后)。所以我想将数字4加到someMOD字段M3(O); S4(P); S6(P),这样我得到M7(O); S8(P); S10(P)然后覆盖新值someMOD专栏。

为每一行做这件事。正则表达式是每行基础。 任何帮助都非常感谢。感谢。

1 个答案:

答案 0 :(得分:2)

首先,我要提一下,很难读取你的数据。我稍微修改它(我从 someMOD 列中删除空格)来读取它们。这不是问题,因为您已将数据存入data.frame。所以我读了这样的数据:

dat <- read.table(text='ID  someLength  someLongerSeq   someSeq someMOD someValue
A   16  XCVBNMHGFDSTHJGF    NMH T3(P)   7
A   16  XCVBNMHGFDSTHJGF    NmH M3(O);S4(P);S6(P) 1
B   24  HDFGKJSDHFGKJSDFHGKLSJDF    HFGKJSDFH   S9(P)   5
C   22  QIOWEURQOIWERERQWEFFFF  RQoIWERER   Q16(D);S19(P)  7
D   19  HSEKDFGSFDKELJGFZZX KELJ    S7(P);C9(C);S10(P)    1',header=TRUE)

然后想法是:

  • 使用apply
  • 逐行处理
  • 使用gregexpr someSeq 的索引导入 someLongerSeq
  • 使用gsubfn将以前的索引添加到 someMOD
  • 的数字中

这里是整个解决方案:

library(gsubfn)
res <- t(apply(dat,1,function(x){
        idx <- gregexpr(x['someSeq'],x['someLongerSeq'],
                        ignore.case = TRUE)[[1]][1]
        x[['someMOD']] <- gsubfn("[[:digit:]]+", 
                                  function(x) as.numeric(x)+idx, 
                                  x[['someMOD']])
        x

}))


 as.data.frame(res)
  ID someLength            someLongerSeq   someSeq              someMOD someValue
1  A         16         XCVBNMHGFDSTHJGF       NMH                T8(P)         7
2  A         16         XCVBNMHGFDSTHJGF       NmH   M8(O);S9(P);S11(P)         1
3  B         24 HDFGKJSDHFGKJSDFHGKLSJDF HFGKJSDFH               S18(P)         5
4  C         22   QIOWEURQOIWERERQWEFFFF RQoIWERER        Q23(D);S26(P)         7
5  D         19      HSEKDFGSFDKELJGFZZX      KELJ S18(P);C20(C);S21(P)         1