2016-08-24 43 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'); 
相關問題