数据集中的标题(Matlab)

4

我找不到关于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  

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

3个回答

3
您可以像以下两种方式之一设置空数据集:
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)]

非常感谢您的回答,我终于搞定了! - Whyaken

1

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

% 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]    

非常感谢您的回答,我终于把它解决了! - Whyaken

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接