【问题标题】:Headers in dataset (Matlab)数据集中的标题(Matlab)
【发布时间】:2011-10-21 07:25:15
【问题描述】:

我找不到任何关于 dataset() 的好的文档,所以我想问你们,我会保持简短的问题:

我可以在数据集中设置标题(列标题),而无需将数据输入数据集中吗?我猜不是,所以问题的第二部分是:
我可以用空数据制作一个单行数据集,在其中命名标题,然后再覆盖它吗?

让我告诉你我在尝试什么,但没有奏效:

dmsdb = dataset({ 'John','Name'},{'Amsterdam','City'},{10,'number' });  
produces:  
    Name    City         number  
    John    Amsterdam    10 --> Headers are good!  

问题是,当我要向数据集添加更多数据时,它希望所有字符串的长度相同。所以我使用 cellstr():

dmsdb(1,1:3) = dataset({ cellstr('John'),'Name'},{cellstr('Amsterdam'),'City'},{10,'number' });  
Produces:  
    Var1          Var2               Var3  
    'John'        'Amsterdam'        10  

我的标题去哪儿了?我该如何解决这个问题,是什么原因造成的?

【问题讨论】:

    标签: dataset matlab


    【解决方案1】:

    您可以设置一个空数据集,例如

    data = dataset({[], 'Name'}, {[], 'City'}, {[], 'number'});
    

    data = dataset([], [], [], 'VarNames', {'Name', 'City', 'number'});
    

    两者都会给你:

    >> data
    
    data = 
    
    [empty 0-by-3 dataset]
    

    但是我们可以看到列名是通过勾选设置的

    >> get(data, 'VarNames')                                             
    
    ans = 
    
        'Name'    'City'    'number'
    

    现在我们可以向数据集添加行:

    >> data = [data; dataset({'John'}, {'Amsterdam'}, 10, 'VarNames', get(data, 'VarNames'))]
    
    data = 
    
        Name          City               number
        'John'        'Amsterdam'        10    
    

    您有基本的想法,但只需要将字符串数据放入单元格中。这个替换你的第一行有效:

    >> dmsdb = dataset({ {'John'},'Name'},{{'Amsterdam'},'City'},{10,'number' }); 
    
    dmsdb = 
    
        Name          City               number
        'John'        'Amsterdam'        10    
    

    dataset() 的内置帮助实际上非常擅长列出这些和其他构建数据集的方法的细节。还可以在以下位置查看带有示例的在线文档:

    http://www.mathworks.com/help/toolbox/stats/dataset.html

    其中一个 Mathworks 博客也有一篇不错的帖子:

    http://blogs.mathworks.com/loren/2009/05/20/from-struct-to-dataset/

    祝你好运!

    【讨论】:

    • 谢谢约翰,你对数据集的解释正是我所需要的。一个关于如何构建空数据集以及如何添加新数据行的清晰示例。甚至在我在这里发布我的问题之前,我确实检查了您提供的那些链接,但是所有这些 {},(),[] 让我头晕目眩。一个很好的例子通常解释的不仅仅是很多文本。因为我无法识别这些链接中的示例,所以您的示例对我的帮助更大!再次感谢!
    • @Whyaken 太棒了!很高兴它有帮助。
    【解决方案2】:

    这是一个例子:

    %# create dataset with no rows
    ds = dataset(cell(0,1),cell(0,1),zeros(0,1));
    ds.Properties.VarNames = {'Name', 'City', 'number'};
    
    %# adding one row at a time
    for i=1:3
        row = {{'John'}, {'Amsterdam'}, 10};  %# construct new row each iteration
        ds(i,:) = dataset(row{:});
    end
    
    %# adding a batch of rows all at once
    rows = {{'Bob';'Alice'}, {'Paris';'Boston'}, [20;30]};
    ds(4:5,:) = dataset(rows{:});
    

    最后的数据集如下:

    >> ds
    ds = 
        Name           City               number
        'John'         'Amsterdam'        10    
        'John'         'Amsterdam'        10    
        'John'         'Amsterdam'        10    
        'Bob'          'Paris'            20    
        'Alice'        'Boston'           30    
    

    注意:如果你想使用连接而不是索引,你必须指定变量名:

    vars = {'Name', 'City', 'number'};
    ds = [ds ; dataset(rows{:}, 'VarNames',vars)]
    

    【讨论】:

    • 非常感谢您的回答,终于搞定了!
    【解决方案3】:

    我同意,对数据集的帮助很难理解,主要是因为创建数据集的方法太多,而且大多数方法都涉及很多元胞数组。以下是我最喜欢的两种方法:

    % 1) Create the 3 variables of interest, then make the dataset.  
    % Make sure they are column vectors!
    >> Name = {'John' 'Joe'}';  City = {'Amsterdam' 'NYC'}'; number = [10 1]';
    >> dataset(Name, City, number)
    
    ans = 
    
        Name          City               number
        'John'        'Amsterdam'        10    
        'Joe'         'NYC'               1    
    
    % 2) More compact than doing 3 separate cell arrays
    >> dataset({{'John' 'Amsterdam' 10} 'Name' 'City' 'number'})
    
    ans = 
    
        Name          City               number  
        'John'        'Amsterdam'        [10]    
    

    【讨论】:

    • 非常感谢您的回答,终于搞定了!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-11-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多