【问题标题】:Convert dataset column to obsnames将数据集列转换为 obsnames
【发布时间】:2014-07-07 05:40:28
【问题描述】:

我的工作区中有许多大型数据集数组(从 .mat 文件加载)。

一个最小的工作示例是这样的

>> disp(old_ds)

Date        firm1       firm2       firm3       firm4
734692      880,0       102,1       32,7        204,2
734695      880,0       102,0       30,9        196,4
734696      880,0       100,0       30,9        200,2
734697      880,0       101,4       30,9        200,2
734698      880,0       100,8       30,9        202,2

第一行(带有字符串)已经是数据集中的标题,也就是说,如果我运行old_ds.Properties.VarNames,它们已经显示出来。
我想知道是否有一种简单和/或快速的方法可以将第一列设为 ObsNames。

作为第一种方法,我考虑“导出”数据矩阵(示例中的第 2 到 5 列)、日期向量,然后创建一个新数据集,其中行有名称。 即:

>> mat = double(old_ds(:,2:5));         % taking the data, making it a matrix array

>> head = old_ds.Properties.VarNames    % saving headers
>> head(1,1) = [];                      % getting rid of 'Date' from head

>> dates = dataset2cell(old_ds(:,1));   % taking dates as column cell array
>> dates(1) = [];                       % getting rid of 'Date' from dates

>> new_ds = mat2dataset(mat,'VarNames',head,'ObsNames',dates);

除了最后一行返回以下错误之外,...

Error using setobsnames (line 25)
NEWNAMES must be a nonempty string or a cell array of nonempty strings.

Error in dataset (line 377)
    a = setobsnames(a,obsnamesArg);

Error in mat2dataset (line 75)
    d = dataset(vars{:},args{:});

...我会找到一个解决方案,然后创建一个函数(例如概括我拥有的所有 22 个数据集数组的过程),然后运行该函数 22 次(每个数据集数组一次)。 从长远来看,每个数据集有 7660 行和 2 到 1320 的列数。

我不知道如何(如果可以的话)使数据集直接“吃掉”第一列作为 ObsNames。

谁能给我一个提示?

编辑:附上 sample file

【问题讨论】:

  • 你能上传一个示例文件吗?
  • @Cici,我编辑了我的问题以包含指向示例文件的链接(最后一行)。希望你能帮忙。谢谢!
  • 无法打开您的文件...也许尝试在保存时添加 -v7.3 标签?
  • @Cici,链接已更新,新文件已使用 -v7.3 标签保存。感谢您的帮助。

标签: matlab dataset


【解决方案1】:

你快到了,你得到的错误信息基本上是说 Obsname 必须是字符串。在您的情况下,“日期”变量是包含双精度的单元格数组。所以你只需要将它们转换为字符串。

mat = double(piHU(:,2:end));         % taking the data, making it a matrix array
head = piHU.Properties.VarNames    % saving headers
head(1) = [];                      % getting rid of 'Date' from head

dates = dataset2cell(piHU(:,1));   % taking dates as column cell array, here dates are of type double. try typing on the command window class(dates{2}), you can see the output is double.
dates(1) = [];  % getting rid of 'Date' from dates
dates_str=cellfun(@(s) num2str(s),dates,'UniformOutput',false); % convert dates to string, now try typing class(dates_str{2}), the output should be char

new_ds = mat2dataset(mat,'VarNames',head,'ObsNames',dates_str); % construct new dataset.

【讨论】:

  • 谢谢@Cici,但即使我的问题不是那个清楚(我的错),我实际上想问是否存在更简单或更快的(或两者),获得相同结果的方法(如函数)。怀疑来自这样一个事实,据我所知,用于导入数据(例如,从 csv)的 GUI 不允许设置 ObsNames(运行 R2013a),我仍然必须熟悉读取/保存/加载命令。跨度>
  • 顺便说一句,如果我获得足够的声誉,我会支持你的答案:)
  • 我明白了,在将 Obsname 转换为字符串元胞数组之后,您也许可以使用 set('Obsname',Obsname)。mathworks.com/help/stats/dataset.set.html
【解决方案2】:

实际上应该很容易(但我正在阅读您的问题,这意味着我遇到了同样的问题,我在查找文档之前先用谷歌搜索了它......;)

加载数据集时,使用以下命令(当然要根据您的情况调整):

cell_dat{1} = dataset('File', 'YourDataFile.csv', 'Delimiter', ';',...
    'ReadObsNames', true);

“ReadObsNames”默认值为 false。它采用第一列的标题并将其作为 A.Properties.DimNames 中第一个维度的名称保存在文件或范围中。 (参见Documentation,章节:“使用文本文件或 Excel 电子表格作为输入时可用的名称/值对”)

我无法下载您的示例文件,但如果您还没有解决问题,请尝试建议的解决方案并判断它是否有效。很高兴能帮上忙。

【讨论】:

    猜你喜欢
    • 2022-06-10
    • 2017-07-23
    • 2019-04-28
    • 2015-11-28
    • 1970-01-01
    • 2011-11-12
    • 2021-10-04
    • 2014-07-06
    • 2017-12-15
    相关资源
    最近更新 更多