Заголовки в наборе данных (Matlab) - PullRequest
4 голосов
/ 20 октября 2011

Я не могу найти хорошую документацию о наборе данных (), поэтому я хочу спросить вас, ребята, я кратко задам вопрос:

Могу ли я установить заголовки (заголовки столбцов) внабор данных, еще не введя данные в набор данных?Наверное, нет, поэтому вторая часть вопроса будет такой:
Могу ли я сделать набор данных из одной строки, в котором я назову заголовки, с пустыми данными и перезаписать его позже?

Позвольте мнепокажу вам, что я пытался, но не сработало:

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 голосов
/ 21 октября 2011

Вы можете установить пустой набор данных, например,

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/

Удачи!

2 голосов
/ 21 октября 2011

Вот пример:

%# 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)]
1 голос
/ 21 октября 2011

Я согласен, справку по набору данных трудно понять, в основном потому, что существует очень много способов создания набора данных, и в большинстве методов используется множество ячеек. Вот два моих любимых способа сделать это:

% 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]    
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...