Matlab: используйте Splitapply для записи нескольких файлов

Я сгруппировал таблицы по переменной и пытаюсь создать несколько файлов на основе переменной группировки. Но это не работает.

Я использовал findgroups и splitapply, но с splitapply у меня возникли проблемы.

Вот одна из версий команд, которые я использую:

load patients;
G=findgroups(Gender);
func=@(x,y) csvwrite(x,y);
splitapply(func,Gender,Weight,G);

Я получаю следующее сообщение об ошибке:

Ошибка при использовании splitapply (строка 132)
При применении функции '@(x,y)csvwrite(x,y)' к 1-й группе данных возникла следующая ошибка:

FILENAME должен быть вектором символов или строковым скаляром.

Когда я выясню, как это использовать, я буду использовать его на больших высоких массивах хранилищ данных. Пожалуйста помоги !


person Hobbycoder    schedule 19.11.2019    source источник
comment
Что не работает? Вы получаете сообщение об ошибке? Если да, то какую ошибку вы получаете?   -  person Daniel    schedule 20.11.2019


Ответы (1)


Проблема в том, что первым параметром csvwrite должно быть имя файла.

В вашем примере кода первым параметром csvwrite является массив ячеек, а не строка.

Вы можете увидеть это, используя следующий трюк:

func=@(x,y) display(x);

Вывод splitapply(func,Gender,Weight,G):

x =

  53×1 cell array

    {'Female'}
    {'Female'}
    {'Female'}
   ...

x =

  47×1 cell array

    {'Male'}
    {'Male'}
    {'Male'}

Решение.
Используйте x{1} вместо x:

func=@(x,y) csvwrite(x{1}, y);

Рекомендуется добавлять к имени файла расширение типа .txt:

func=@(x,y) csvwrite([x{1}, '.txt'], y);

Примечание:
Возможно, комбинация splitapply с csvwrite не соответствует первоначальному назначению функции splitapply.
Согласно документации, похоже, что splitapply лучше подходит для статистических расчетов (и не предназначена для использования в операциях ввода-вывода). [запись файлов]).
Я не уверен, что приведенный выше шаблон кода подходит для "использования его на больших высоких массивах хранилища данных".


Полный пример кода:

load patients;
G=findgroups(Gender);

%The first parameter of csvwrite must be a file name.
%x{1} = 'Male' for all the Male group, and 'Female' for all the Female group.
%[x{1}, '.txt'] adds a '.txt' extension to the file name.
%
%y will be array of Weight like
%[71
% 69
% 68]
func=@(x,y) csvwrite([x{1}, '.txt'], y);

splitapply(func,Gender,Weight,G)
person Rotem    schedule 19.11.2019