regexp和strsplit用于分隔字符串数组,然后将值保存在新数组中

时间:2016-01-22 16:43:22

标签: matlab

我有列的列表(超过12200x3)包含名为AffyID的字符串值,我想将它们转换为数字和符号,如表中所示,一些AffyID有多个数字,符号用'///'分隔

    AffyID           Gene Entrez           GeneSymbol   
       '53202_at'     '5683 /// 79020'       'C7orf25 /// PSMA2'
       '214878_at'    '100129482 /// 7587'   'ZNF37A /// ZNF37B'
       '200855_at'  '100131704 /// 149934 /// 9611' 'C20orf191 /// LOC100131704 /// NCOR1'
       '200856_x_at'    '100131704 /// 149934 /// 9611' 'C20orf191 /// LOC100131704 /// NCOR1'
        '200869_at'   '390354 /// 6142'    'RPL18A /// RPL18AP3'

我使用strfind分离Gene Entrez列,然后将值保存在新数组中,例如

p1=strfind(EntrezList,'///');
   if(isempty(p1))
      j=j+1;
      filteredData(j,1)=raw_data(i,1);
      filteredData(j,2)=raw_data(i,2);
      filteredData(j,3)=raw_data(i,3);
   else
      j=j+1;
      entrez_ID=EntrezList(1:p1(1)-1);
      filteredData{j,1}= raw_data{i,1};
      filteredData{j,2}= str2double(entrez_ID);
      filteredData(j,3)= raw_data(i,3);
      if( length(p1)>1)
         for k=1:length(p1)-1
             j=j+1;
             entrez_ID=EntrezList(p1(k)+3:p1(k+1)-1);
             filteredData{j,1}= raw_data{i,1};
             filteredData{j,2}= str2double(entrez_ID);
             filteredData(j,3)= raw_data(i,3);
         end

不幸的是我尝试使用regexp和strsplit对基因符号列执行相同的操作但是它不起作用

你能帮忙解决一下我会感激你的问题  我希望输出像:

    AffyID               Gene Entrez       GeneSymbol   
    '53202_at'       5683              C7orf25
    '53202_at'           79020             PSMA2   
    '214878_at'          100129482         ZNF37A
    '214878_at           7587              ZNF37B

1 个答案:

答案 0 :(得分:0)

在这种情况下,

regexp可以节省生命。我建议你通过阅读文档并在regex101.com上尝试表达来试一试。在这种情况下,如果工作区中有以下变量:

>> geneEntrez

geneEntrez = 

'5683 /// 79020'
'100129482 /// 7587'
'100131704 /// 149934 /// 9611'`

以下内容将为您提供:

geneEntrezSplit = regexp(geneEntrez,'(\d*)\D*','tokens')
geneEntrezSplit = 

{1x2 cell}
{1x2 cell}
{1x3 cell}

新的拆分单元格数组包含每个标记的字符串。找到正则表达式的含义是一项练习。对于您的基因符号,您需要表达式(\w*)\W*。现在,如果您有Affy Id vaiables:

>> geneAffyId

geneAffyId = 

'53202_at'
'214878_at'
'200855_at'

使用以下方法组合这些以生成单元格数组:

>> splitData = cellfun(@(x1,x2)[repmat({x1},length(x2),1) [x2{:}]'],geneAffyId,geneEntrezSplit,'UniformOutput',false)

splitData = 

{2x2 cell}
{2x2 cell}
{3x2 cell} 


>>tfmData = vertcat(splitData{:})

tfmData = 

'53202_at'     '5683'     
'53202_at'     '79020'    
'214878_at'    '100129482'
'214878_at'    '7587'     
'200855_at'    '100131704'
'200855_at'    '149934'   
'200855_at'    '9611'    

我希望它能让您了解如何获得结果。如果你想要包含你的cellfun调用想要的thiord列

splitData = cellfun(@(x1,x2,x3)[repmat({x1},length(x2),1) [x2{:}]' [x3{:}]'],geneAffyId,geneEntrezSplit,geneSymbolSplit'UniformOutput',false)