你能在xlswrite,matlab上用类似的书面列标题对数据进行分组吗?

时间:2016-02-22 16:33:04

标签: excel matlab

matlab非常新,还在学习基础知识。我正在尝试编写一个脚本来计算波形中两个峰值之间的距离。我已经设法做的那部分,我已经使用xlswrite将我获得的值放到excel文件中。

对于每个文件,我有大约50-250列,只有两行:第二行有数值,第一行有列标题,从我从中提取数据的原始excel文件中复制。

某些列具有相似但不相同的标题,例如'green227RightEyereading3'和'green227RightEyereading4'等。有没有办法可以对具有相似标题的列进行分组,例如在标题(I.e.green227)和“右眼”或“左眼”中具有相同的数字/颜色,并计算其数值的平均值?链接到此处的文件:> https://www.dropbox.com/s/ezpyjr3raol31ts/SampleBatchForTesting.xls?dl=0>

    >[Excel_file,PathName] = uigetfile('*.xls', 'Pick a File','C:\Users\User\Documents\Optometry\Year 3\Dissertation\A-scan3'); 
    >[~,name,ext] = fileparts(Excel_file); 

    >sheet = 2;
    >FullXLSfile = [PathName, Excel_file];
    >[number_data,txt_data,raw_data] = xlsread(FullXLSfile,sheet);


    >HowManyWide = size(txt_data);
    >NumberOfTitles = HowManyWide(1,2);
    >xlRangeA = txt_data;


    >Chickens = {'Test'};
    >for f = 1:xlRangeA; %%defined as top line of cells on sheet;
    >Text = xlRangeA{f};  
    >HyphenLocations = find(Text == '-');
    >R = HyphenLocations(1,1) -1;
    >Chick = Text(1:R);
    >Chick = cellstr(Chick);
    >B = length(Chick);
    >TF = strncmp(Chickens,Chick,B);
    >if any(TF == 1); %do nothing
    >else 
    >Chickens = {Chickens;Chick};
    >end
    >end

这里也是我运行整个脚本时创建的文件的链接。标题下方的值是我正在分析的组织的计算厚度。 https://www.dropbox.com/s/4p6iu9kk75ecyzl/Choroid_Thickness.xls?dl=0

非常感谢

1 个答案:

答案 0 :(得分:1)

如果不同的字符位于标题的最末端(或最开头),则可以使用 strncmp buit-in函数并仅比较字符串的一部分。查看更多here。但请提供一些代码和excel文件的一部分。这会有所帮助。

此外,如果我没有记错,您将所有数据保存到Excel中,然后再次重新调用它以对其进行排序。也许你应该考虑只保存excel中的最终结果,它会节省你一些时间,特别是如果你想多次运行你的脚本。

编辑:

这是我提出的代码。它肯定不是最好的解决方案,但它适用于您上传的文件。我省略了不必要的行和变量。只有当每个读数的数字具有相同的数字时,代码才有效。只要每个条目有4位数,它们就可以是4位数。因为在每个文件中你都有相同颜色的波,你唯一关心的是用左眼还是右眼记录读数(正确吗?)。基于该代码和您编写的代码,比较涉及包含单词“Right”或“Left”的字符串部分,即连字符之间的字符。

[Excel_file,PathName] = uigetfile('*.xls', 'Pick a File',...
'C:\Users\User\Documents\Optometry\Year 3\Dissertation\A-scan3'); 

sheet = 1; 
FullXLSfile = [PathName,Excel_file]; 
[number_data,txt_data,raw_data] = xlsread(FullXLSfile,sheet); 

%% data manipulation
NumberOfTitles = length(txt_data); 
TextToCompare = txt_data{1};
r1 = 1;                            % counter for Readings1 vector
r2 = 1;                            % counter for Readings2 vector
for ff = 1:NumberOfTitles          % in your code xlRangeA is a cell vector not a number!
    Text = txt_data{ff};           
    HyphenLocations = find(Text == '-');
    Text = Text(HyphenLocations(1,1):HyphenLocations(1,2));                    % take only the part that contains the "eye" information
    TextToCompare = TextToCompare(HyphenLocations(1,1):HyphenLocations(1,2));  % same here
    if (Text == TextToCompare)
        Readings1(r1) = number_data(ff);  % store the numerical value in a vector
        r1 = r1 + 1;                      % increase the counter of this vector
    else
        Readings2(r2) = number_data(ff);  % same here
        r2 = r2 + 1;
    end
    TextToCompare = txt_data{1};  % TextToCompare re-initialized for the next comparison
end
mean_readings1 = mean(Readings1); % Find the mean of the grouped values
mean_readings2 = mean(Readings2);

我很肯定这可以通过更有效和更细致的方式完成。我不知道你想要做什么样的计算,所以我只把平均值作为例子。在if语句中,如果需要,您还可以存储txt_data。下面我还介绍了第二种方法,我发现它更加细腻。如果您想测试它,只需用%%data manipulation部分替换下面的部分:

%% more delicate way
Text_Vector = char(txt_data);
TextToCompare2 = txt_data{1};
HyphenLocations2 = find(TextToCompare2 == '-');
TextToCompare2 = TextToCompare2(HyphenLocations2(1,1):HyphenLocations2(1,2));
Text_Vector = Text_Vector(:,HyphenLocations2(1,1):HyphenLocations2(1,2));
Text_Vector = cellstr(Text_Vector);
dummy = strcmpi(Text_Vector,TextToCompare2);
Readings1 = number_data(dummy);
Readings2 = number_data(~dummy);

我希望这会有所帮助。