Inserisci i dati interstiziali nelle serie di count

Ho diversi file CSV con 3 colonne:

  • La colonna 1 è un identificatore
  • La colonna 2 è una concentrazione corrispondente e
  • La colonna 3 è un volume.

Gli identificatori eseguono semplicemente nell'ordine dal 1-950, ma non sono presenti in ciascun campione e quindi each file CSV.

C'è un modo per utilizzare Excel o MATLAB per compilare i numbers che non sono presenti? In questo modo, quando li unisco in matrix 2D, tutti si allineano insieme.

Attualmente sembra:

Compound Name,Peak Value,Volume 1,627434.8768,5.50E+07 5,2.53E+07,5.11E+08 7,1.64E+07,3.07E+08 

Idealmente, sarebbe

 Compound Name,Peak Value,Volume 1,627434.8768,5.50E+07 2,0,0 3,0,0 4,0,0 5,2.53E+07,5.11E+08 6,0,0 7,1.64E+07,3.07E+08 

Fornirò una soluzione utilizzando MATLAB. Quello che puoi fare prima è leggere nei tuoi dati utilizzando csvread ma ignorare la prima row poiché contiene le intestazioni. Dopo, crea una matrix 2D in cui la prima row è delineata da 1 a 950. Successivamente, utilizza la prima colonna dei dati che csvread attraverso csvread e indice in questa matrix 2D in modo da poter memorizzare le righe corrispondenti per each identificatore in questo matrix. Al termine, scrivere questa nuova matrix in un nuovo file.

Naturalmente, è necessario aprire il file originale per get le voci in primo luogo, scrivere in un nuovo file quindi i tuoi dati dovrebbero seguire dopo. Potete farlo con fopen per aprire il file, quindi fgetl per recuperare la prima row del file originale.

Diciamo che il tuo file è stato chiamato test.csv . Il codice potrebbe sembrare qualcosa di simile:

 M = csvread('test.csv', 1, 0); %// Parse through file starting from second row out = [(1:950).' zeros(950,2)]; %// Create empty 2D matrix like before out(M(:,1),2:3) = M(:,2:3); %// Populate the matrix and index into the right rows fid = fopen('test.csv', 'r'); %// Open up the original file for reading fid2 = fopen('out.csv', 'w'); %// Open up the output file for writing first_line = fgetl(fid); %// Get the first line of the original file fprintf(fid2, '%s\n', first_line); %// Write this first line to the output file fprintf(fid2, '%d,%e,%e\n', out.'); %// Write the modified 2D arrays to file fclose(fid); fclose(fid2); %// Close both of the files 

Il codice riportto di seguito è autocompensabile con i commenti. Il file CSV in output viene scritto chiamato out.csv . Tuttavia, l'intricata che vi indicherò è la seconda ultima linea di codice. Vedi come stampo la prima colonna come integer ( '%d' modifier), mentre gli altri numbers sono in notazione esponenziale ( '%e' modificatore) per soddisfare il tuo esempio che hai mostrato sopra. Inoltre, MATLAB si occupa dei dati in formato colonna-principale e quindi è necessario scrivere la trasposizione della matrix in file (quindi l'operatore).

Utilizzando i dati di prova e il codice di cui sopra, ecco le prime 11 righe (10 voci di dati + row) visualizzate nel file CSV in output:

 Compound Name,Peak Value,Volume 1,6.274349e+05,5.500000e+07 2,0.000000e+00,0.000000e+00 3,0.000000e+00,0.000000e+00 4,0.000000e+00,0.000000e+00 5,2.530000e+07,5.110000e+08 6,0.000000e+00,0.000000e+00 7,1.640000e+07,3.070000e+08 8,0.000000e+00,0.000000e+00 9,0.000000e+00,0.000000e+00 10,0.000000e+00,0.000000e+00 

Se i tuoi identificatori sono sempre numbers naturali, in Matlab puoi farlo con l'indexing solo:

 input = [1, 627434.8768, 5.50E+07 5, 2.53E+07, 5.11E+08 7, 1.64E+07, 3.07E+08]; output = zeros(max(input(:,1)), size(input,2)); %// initiallize with zeros output(input(:,1),:) = input; %// fill in available values