到目前为止,我已经能够合并两个文件并获得以下数据帧(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专栏。
为每一行做这件事。正则表达式是每行基础。 任何帮助都非常感谢。感谢。
答案 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