0

これまでのところ、2 つのファイルをマージして、次のデータフレーム (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:

2 行目の"ID:A","someSeq":"NmH"一致は、someLongerSeq の位置 4 から始まります (NmH の上位変換後)。そのため、その数値 4 を someMOD フィールド M3(O);S4(P);S6(P) に追加して、M7(O);S8(P);S10(P) を取得し、新しい値を上書きしますsomeMOD 列。

そして、それを行ごとに行います。正規表現は行ベースごとです。どんな助けでも本当に感謝しています。ありがとう。

4

1 に答える 1

2

まず第一に、あなたのデータを読むのは難しいと言わなければなりません。それらを読み取るために、少し変更します(一部のMOD列からスペースを削除します)。既にデータが 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
  • someSeqgregexprのインデックスを 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
于 2013-06-02T01:05:07.523 に答える