2016-08-24 54 views
0

我是一名研究化学家,进行了一次测量,我记录了'信号强度'与'质荷比(m/z)'。我通过改变一个特定的参数(碰撞能量)重复了这个实验15x。因此,我有15个CSV文件,并希望在相同范围的m/z值和相同的间隔值内对齐/连接它们。由于仪器阈值规则,某些m/z值未被记录,因此我有不能简单地导出到excel并复制/粘贴的文件。的数据看起来有点像的表下面贴如何导入多个CSV文件然后创建主表?

Dataset 1: x | y   Dataset 2: x | y 
      ---------     ---------  
      0.0 5      0.0 2 
      0.5 3      0.5 6 
      2.0 7      1.0 9 
      3.0 1      2.5 1 
             3.0 4 

用matlab我开始与此代码:

%% Create a table for the set m/z range with an interval of 0.1 Da 
mzrange = 50:0.1:620; 
mzrange = mzrange'; 
mzrange = array2table(mzrange,'VariableNames',{'XThompsons'}); 

然后我手动导入1 X/Y CSV(Xtitle = XThompson,Ytitle = YCounts)以与指定的m/z范围对齐。

%% Join/merge the two tables using a common Key variable 'XThompson' (m/z value) 
mzspectrum = outerjoin(mzrange,ReserpineCE00,'MergeKeys',true); 

% Replace all NaN values with zero 
mzspectrum.YCounts(isnan(mzspectrum.YCounts)) = 0; 

在这一点上我坚持,因为重复这个过程,一个单独的文件将覆盖我YCounts列。的YCounts列并不重要我为我以后可以改变它的标题,但是我想有表继续这样的:

XThompson | YCounts_1 | YCounts_2 | YCounts_3 | etc... 
-------------------------------------------------------- 

我怎么能从事这项运动在Matlab所以,这是至少半自动化?之前我曾发布过描述类似的情况,但事实证明它不能实现我所需要的。我必须承认,我的思想不是程序员,所以我一直在努力解决这个问题。

PS-这个问题最好在Matlab或Python中执行吗?

回答

0

我设法创建一个解决我的问题基础上的学习,您可以通过使用导出合并后的数据为Excel工作表通过大家的输入和在线matlab课程。我不是一个自然的编码器,所以我的脚本不像这里的天才那么优雅,但是希望对于其他非编程科学家来说,它足够清楚。

下面是对我的作品的结果:

%读取包含一个目录*的.csv文件并且校正X轴,以均匀间隔(0.1单位)的时间间隔。

% Create a matrix with the input x range then convert it to a table 
prompt = 'Input recorded min/max data range separated by space \n(ex. 1 to 100 = 1 100): '; 
inputrange = input(prompt,'s'); 
min_max = str2num(inputrange) 
datarange = (min_max(1):0.1:min_max(2))'; 
datarange = array2table(datarange,'VariableNames',{'XAxis'}); 

files = dir('*.csv'); 
for q=1:length(files); 

    % Extract each XY pair from the csvread cell and convert it to an array, then back to a table. 
    data{q} = csvread(files(q).name,2,1); 
    data1 = data(q); 
    data2 = cell2mat(data1); 
    data3 = array2table(data2,'VariableNames',{'XAxis','YAxis'}); 

    % Join the datarange table and the intensity table to obtain an evenly spaced m/z range 
    data3 = outerjoin(datarange,data3,'MergeKeys',true); 
    data3.YAxis(isnan(data3.YAxis)) = 0; 
    data3.XAxis = round(data3.XAxis,1); 

    % Remove duplicate values 
    data4 = sortrows(data3,[1 -2]); 
    [~, idx] = unique(data4.XAxis); 
    data4 = data4(idx,:); 

    % Save the file as the same name in CSV without underscores or dashes 
    filename = files(q).name; 
    filename = strrep(filename,'_',''); 
    filename = strrep(filename,'-',''); 
    filename = strrep(filename,'.csv',''); 
    writetable(data4,filename,'FileType','text'); 
    clear data data1 data2 data3 data4 filename 

end 
clear 
0

我不知道或使用matlab,所以我的答案是纯粹的基于python。我认为python和matlab应该同样适合读取csv文件并生成主表。

请考虑这个答案更多作为指针如何解决python中的问题。

在python中,通常使用pandas包来解决这个问题。这个软件包提供“高性能,易于使用的数据结构和数据分析工具”,并且可以本地读取一大组文件格式,包括CSV文件。例如,可以生成来自两个CSV文件“foo.csv”和“bar.csv”的主表。如下所示:

import pandas as pd 
df = pd.read_csv('foo.csv') 
df2 = pd.read_csv('bar.cvs') 

master_table = pd.concat([df, df2]) 

熊猫还允许以多种方式对数据进行分组和结构化。 pandas documentation对其各种功能有很好的描述。在Linux或OSX

sudo pip install pandas 

如果:

人们可以使用Python包安装pip安装熊猫。

0

来自不同分析的计数应分别在不同数据集中分别从分析1,2和3中分别命名为YCounts_1,YCounts_2和YCounts_3,然后再加入它们。但是,M/Z名称(即XThompson)应该是相同的,因为这是用来加入数据集的关键。下面的代码是用于MATLAB的。

这一步是不需要的(只是重新创建您的表),我复制dataset2创建数据集3的插图。你可以使用'readtable'来导入你的数据,即imported_data = readtable('filename');

dataset1 = table([0.0; 0.5; 2.0; 3.0], [5; 3; 7; 1], 'VariableNames', {'XThompson', 'YCounts_1'}); 
    dataset2 = table([0.0; 0.5; 1.0; 2.5; 3.0], [2; 6; 9; 1; 4], 'VariableNames', {'XThompson', 'YCounts_2'}); 
    dataset3 = table([0.0; 0.5; 1.0; 2.5; 3.0], [2; 6; 9; 1; 4], 'VariableNames', {'XThompson', 'YCounts_3'}); 

使用outerjoin合并表。如果你有很多数据集,你可以使用循环。

combined_dataset = outerjoin(dataset1,dataset2, 'MergeKeys', true); 

dataset3添加到combined_dataset

combined_dataset = outerjoin(combined_dataset,dataset3, 'MergeKeys', true); 

writetable

writetable(combined_dataset, 'joined_icp_ms_data.xlsx');