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

regexp and strsplit use to separate string array then save the values in new array such

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

1
2
3
4
5
6
    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列,然后将值保存在新数组中,例如

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
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对基因Symbols列执行相同操作,但是它不起作用

您能帮我解决问题吗,我将不胜感激
我想要这样的输出:

1
2
3
4
5
    AffyID               Gene Entrez       GeneSymbol  
    '53202_at'       5683              C7orf25
    '53202_at'           79020             PSMA2  
    '214878_at'          100129482         ZNF37A
    '214878_at           7587              ZNF37B


在这种情况下,

regexp可以挽救生命。我建议您通过阅读文档中的内容并尝试regex101.com上的表达式来尝试一下。在这种情况下,如果工作空间中具有以下变量:

1
2
3
4
5
6
7
>> geneEntrez

geneEntrez =

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

以下内容将为您提供:

1
2
3
4
5
6
geneEntrezSplit = regexp(geneEntrez,'(\\d*)\\D*','tokens')
geneEntrezSplit =

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

新的拆分单元格数组包含每个令牌的字符串。查找正则表达式的含义对您来说是一项练习。对于您的基因符号,您将需要表达式(\\w*)\\W*。现在,如果您有一个Affy Id可用商品,如下所示:

1
2
3
4
5
6
7
>> geneAffyId

geneAffyId =

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

使用以下命令组合这些单元以生成单元格数组:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
>> 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'

我希望它能使您了解如何达到目标。如果要包括thiord列,您的cellfun调用将要求

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