我使用R来处理一个data.frame;一列有一定的字母和数字的混合,我想在字符模式之间加一个逗号:
输入:
arr 11p15.5(2097357-2432381)x311p15.4(3424982-4083881)x3 pat.nuc ish11p15.5(RP11-558K10x3
arr 11p15.5(2097357-2432381)x211p15.4(3224902-4383881)x1 pat
arr 11p15.5(2097357-2432381)x1 mat13q15.4(3224902-3483881)x1 pat期望产出:
arr 11p15.5(2097357-2432381)x3,11p15.4(3424982-4083881)x3 pat.nuc ish11p15.5(RP11-558K10x3
arr 11p15.5(2097357-2432381)x2,11p15.4(3224902-4383881)x1 pat
arr 11p15.5(2097357-2432381)x1 mat,13q15.4(3224902-3483881)x1 pat基本上,我想在第一个(xxx-xxx)x1之后加上一个逗号(这里可以是x1,x2,x3,然后在x1后面有一个"mat","pat“)。
感谢MichaelChirico和Onyambu,我从那个专栏中提取了更多的内容,
输入'arr 11p15.5(2097357-2432381)x311p15.4(3424982-4083881)x3 pat.nuc ish11p15.5(RP11-558K10x3','arr 11p15.5(2097357-2432381)x211p15.4(3224902-4383881)x1 pat','arr 11p15.5(2097357-2432381)x1 mat13q15.4(3224902-3483881)x1 pat','arrhg19 Xp22.33p22.12(60701-21536551)x1~3 x21.31q28(90731177-155208244)x1 ish',‘'arr 11p15.5(2097357-2432381)x3,11p15.4(3424982-4083881)x3 pat.nuc ish11p15.5(RP11-558K10x3)','nuc ish(D21S259/D21S341/D21S342x3).arr(21)x310q26.12(121812494-122486677)x1’‘
输出'arr 11p15.5(2097357-2432381)x3,11p15.4(3424982-4083881)x3 pat.nuc ish11p15.5(RP11-558K10x3','arr 11p15.5(2097357-2432381)x2,11p15.4(3224902-4383881)x1 pat','arr 11p15.5(2097357-2432381)x1 mat,13q15.4(3224902-3483881)x1 pat','arrhg19 Xp22.33p22.12(60701-21536551)x1~3,Xq21.31q28(90731177-155208244)x1 ish',‘'arr 11p15.5(2097357-2432381)x3,11p15.4(3424982-4083881)x3 pat.nuc ish11p15.5(RP11-558K10x3)','nuc ish(D21S259/D21S341/D21S342x3).arr(21)x3,10q26.12(121812494-122486677)x1’‘
我正在尝试下面的代码,但是适用于所有的情况,
X <- c( 'arr 11p15.5(2097357-2432381)x311p15.4(3424982-4083881)x3 pat.nuc ish11p15.5(RP11-558K10x3),'arr 11p15.5(2097357-2432381)x211p15.4(3224902-4383881)x1 pat','arr 11p15.5(2097357-2432381)x1 mat13q15.4(3224902-3483881)x1 pat','arrhg19 Xp22.33p22.12(60701-21536551)x1~3 Xq21.31q28(90731177-155208244)x1 ish',‘'arr 11p15.5(2097357-2432381)x3,11p15.4(3424982-4083881)x3 pat.nuc ish11p15.5(RP11-558K10x3)',nuc ish(D21S259/D21S341/D21S342x3).arr(21)x310q26.12(121812494-122486677)x1’)子(pattern=‘’()x1_2\smat\smat_pat_dn?) ',替换= '\1,‘,x=x)
发布于 2018-02-27 03:49:45
sub("(\\).*?)(\\d{2}[a-z])","\\1,\\2",x)
[1] "arr 11p15.5(2097357-2432381)x3,11p15.4(3424982-4083881)x3 pat.nuc ish11p15.5(RP11-558K10x3"
[2] "arr 11p15.5(2097357-2432381)x2,11p15.4(3224902-4383881)x1 pat"
[3] "arr 11p15.52097357-2432381)x1 mat,13q15.4(3224902-3483881)x1 pat" 发布于 2018-02-27 03:47:44
你说过
我想在第一个
(xxx-xxx)x1后面加上一个逗号
但你的第三个案子与此相矛盾。在澄清替换规则之前,您可以尝试,对于字符串x的向量,
sub('([(][0-9]{7}-[0-9]{7}[)]x[0-9])', '\\1,', x)您还可能希望将[0-9]替换为\\d,后者对区域设置稍微更健壮:
sub('([(]\\d{7}-\\d{7}[)]x\\d)', '\\1,', x)为了在第三次尝试中适应mat,您可以尝试:
sub('([(]\\d{7}-\\d{7}[)]x\\d(\\smat)?)', '\\1,', x)但这是高度定制的,完全适合你的例子。
发布于 2018-02-27 05:04:02
可以执行以下操作
x <- c(
'arr 11p15.5(2097357-2432381)x311p15.4(3424982-4083881)x3 pat.nuc ish11p15.5(RP11-558K10x3',
'arr 11p15.5(2097357-2432381)x211p15.4(3224902-4383881)x1 pat',
'arr 11p15.5(2097357-2432381)x1 mat13q15.4(3224902-3483881)x1 pat'
)
sub(pattern = "([(][0-9]+-[0-9]+[)]x[0-9])([^[:space:]].*)", replacement = "\\1,\\2", x = x)以下是一个简短的解释:
1) matchin (xxx-xxx)x1的Regexp是[(][0-9]+-[0-9]+[)]x[0-9],这里我使用[]而不是转义来匹配(。Rest可以读取为数字--任意次数的数字-- [0-9]+,-,再加上数字,[0-9]+,),x和数字[0-9]。
2)利用捕获组对字符串进行分割,然后将非空格字符上的字符串与任意数量的([^[:space:]].*)字符分开,使1中的模式位于第一组中,其余的在第二组中。并将加入,的2组"\\1,\\2"连在一起
https://stackoverflow.com/questions/49000653
复制相似问题