我有一个文本文件,其中包含基因信息,如关系和基因之间关系的一部分。
此文本文件包含每个GOTerm的段落(GO术语是包含某些代码编号的节点,如:GO:0030436),其中包含:Go term ID(每个段落的第一行)和isa(如果有)(从isa开始,以isa的结尾结束,以及Go的一部分(如果有的话)(从partof开始:以partof的结尾结束)这个文本文件中的一个小样本是:
GO:0030436
isa:
GO:0034297
GO:0043936
GO:0048315
end of isa
partof:
GO:0042243
end of partof
genes:
end of genes
GO:0034297
isa:
end of isa
partof:
end of partof
genes:
end of genes
GO:0043936
isa:
GO:0001410
GO:0034300
GO:0034301
GO:0034302
GO:0034303
GO:0034304
end of isa
partof:
end of partof
genes:
end of genes
我需要阅读这个文本文件并从中获取三个数据并制作一个包含3列的单元格矩阵,如下所示:
map=
ID GoTerms is_a partof
GO:0030436 GO:0034297 GO:0042243
GO:0030436 GO:0043936 0
GO:0030436 GO:0048315 0
GO:0034297 0 0
GO:0043936 GO:0001410 0
GO:0043936 GO:0034300 0
GO:0043936 GO:0034301 0
GO:0043936 GO:0034302 0
GO:0043936 GO:0034303 0
GO:0043936 GO:0034304 0
请注意,如果每个Go术语包含多个术语或部分术语,我应重复使用Go术语ID,以使单元格矩阵适合且组织良好。
关于如何制作此代码的任何想法?
我尝试制作代码,但它不起作用,因为我不知道如何使用超过1个isa和部分术语:
s={};
fid = fopen('Opt.pad'); % read from the certain text file
tline = fgetl(fid);
while ischar(tline)
s=[s;tline];
tline = fgetl(fid);
end
% find start and end positions of every [Term] marker in s
terms = [find(~cellfun('isempty', regexp(s, '\GO:\w*'))); numel(s)+1];
% for every [Term] section, run the previously implemented regexps
% and save the results into a map - a cell array with 3 columns map = cell(0,3);
for term=1:numel(terms)-1
% extract single [Term] data
s_term = s(terms(term):terms(term+1)-1); % match regexps
%To generate the GO_Terms vector from the text file
tok = regexp(s_term, '^(GO:\w*)', 'tokens');
idx = ~cellfun('isempty', tok);
GO_Terms=cellfun(@(x)x{1}, (tok(idx))); %To generate the is_a relations vector from the text file
tok = regexp(s_term, '^isa: (GO:\w*)', 'tokens');
idx = ~cellfun('isempty', tok);
is_a_relations =cellfun(@(x)x{1}, (tok(idx))); %To generate the part_of relaions vector from the text file
tok = regexp(s_term, '^partof: (GO:\w*)', 'tokens');
idx = ~cellfun('isempty', tok);
part_of_relations =cellfun(@(x)x{1}, (tok(idx))); % map. note the end+1 - here we create a new map row. Only once!
map{end+1,1} = GO_Terms;
map{end, 2} = is_a_relations;
map{end, 3} = part_of_relations;
end map( cellfun(@isempty, map) ) = {0};
答案 0 :(得分:0)
一个简短而简单的解决方案(尽管可能不是最快的):
% # Parse text file
C = textread('Opt.pad', '%s', 'delimiter', '');
% # Obtain indices for isa elements
idx = reshape(find(~cellfun(@isempty, strfind(C, 'isa')))', 2, []);
isa = arrayfun(@(x, y)x + 1:y - 1, idx(1, :), idx(2, :), 'Uniform', false);
% # Obtain indices for partof elements
idx = reshape(find(~cellfun(@isempty, strfind(C, 'partof')))', 2, []);
partof = arrayfun(@(x, y)x + 1:y - 1, idx(1, :), idx(2, :), 'Uniform', false);
% # Obtain indices of GO term elements and IDs
go = find(cellfun(@(s)any(strfind(s, 'GO:')), C));
id = go(~ismember(go, [isa{:}, partof{:}]));
% # Construct a new cell array
N = cellfun(@(x, y)max([numel(x), numel(y), 1]), isa, partof);
k = cumsum([1, N(1:end - 1)]);
X = cell(sum(N), 3); % # Preallocate memory!
repcell = @(x, n)arrayfun(@(y)x, 1:n, 'Uniform', false);
for ii = 1:numel(id)
idx = k(ii):k(ii) + N(ii) - 1;
X(idx, 1) = repcell(C{id(ii)}, N(ii));
X(idx, 2) = [C{isa{ii}}, repcell('0', N(ii) - numel(isa{ii}))];
X(idx, 3) = [C{partof{ii}}, repcell('0', N(ii) - numel(partof{ii}))];
end
这应该产生以下输出:
X =
'GO:0030436' 'GO:0034297' 'GO:0042243'
'GO:0030436' 'GO:0043936' '0'
'GO:0030436' 'GO:0048315' '0'
'GO:0034297' '0' '0'
'GO:0043936' 'GO:0001410' '0'
'GO:0043936' 'GO:0034300' '0'
'GO:0043936' 'GO:0034301' '0'
'GO:0043936' 'GO:0034302' '0'
'GO:0043936' 'GO:0034303' '0'
'GO:0043936' 'GO:0034304' '0'