我已按变量对表进行了分组,并且尝试基于分组变量来写入多个文件。但这不起作用。
我曾经使用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)'应用于第一组数据会产生以下错误:FILENAME必须是字符向量或字符串标量。
当我弄清楚如何使用它时,将在大型数据存储高阵列上使用它。请帮忙!
答案 0 :(得分:0)
问题在于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
更适合用于统计计算(而不打算用于I / O操作[写入文件])。
我不确定上述代码模式是否是“在大型数据存储塔阵列上使用它”的正确方法。
完整的代码示例:
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)