使用哑变量unstack重塑表(编辑:替代交叉表方法)

7视图(30天)
后根据一组变量排序表,我喜欢把组值作为“头”列并将其成员在其他同一行中的列。
数据为了骨干示范:
C = {第一季度的,第一季度的,“第二季”,“第三季”,“第三季”,“第三季”;
“苹果”,“:”,“香蕉”,“橙”,“猩猩”,“橙”}';
T = cell2table (C,“VariableNames”,{“代码”,“水果”});
[GroupsID、组]= findgroups (T.code);
unique_groupID =独特(GroupsID);
gT =表(“大小”4],[10日,“VariableTypes”,{“字符串”,“字符串”,“字符串”,“字符串”});
方法1。(编辑)残酷的for循环,我不喜欢,和它的结果需要更多的处理在每一行删除冗余。
k = 1:大小(unique_groupID)
%提取组元素从“水果”
tmp = T.fruit (GroupsID = = unique_groupID (k));
l =大小(tmp ', 2);
gT (k, 1) ={组(k)};
gT (k, 2: l + 1) = tmp”;
结束
rmmissing (gT,“MinNumMissing”3)
ans =3×4表
Var1 Var2 Var3 Var4 ____ ________ _____ _____“苹果”“q1:“<失踪>“第二季”“香蕉”<失踪> <失踪>“第三季”“橙色”“猩猩”“橙色”
方法2使用unstack
我创建了一个哑变量的方法为了使用unstack ()。代码较短但不给我想要的结果。
D = {“dm1”,“dm2”,“dm3”,“dm4”,“dm5”,“德国”;
第一季度的,第一季度的,“第二季”,“第三季”,“第三季”,“第三季”;
“苹果”,“:”,“香蕉”,“橙”,“猩猩”,“橙”}';
T = cell2table (D,“VariableNames”,{“假”,“代码”,“水果”});
unstack (T)“水果”,“假”)
ans =表3×7
代码 dm1 dm2 dm3 dm4 dm5 德国马克 ______ __________ __________ __________ __________ __________ __________{q1的}{‘苹果’}{':'}{0×0字符}{0×0字符}{0×0字符}{0×0字符}{q2的}{0×0字符}{0×0字符}{“香蕉”}{0×0字符}{0×0字符}{0×0字符}{“第三季”}{0×0字符}{0×0字符}{0×0字符}{“橙色”}{‘猩猩’}{“橙色”}
编辑。方法使用交叉表3。该方法很好地工作,但我希望我没有使用一个for循环。这种方法的结果正是我想要的。
[结核病,~,~,磅]=交叉表(T。代码,T.fruit);
for循环创建目标表:
m =大小(结核,1);
头=磅(1:m, 1);
水果=磅(:,2);
gT =表(“大小”4],[6日,“VariableTypes”,{“字符串”,“字符串”,“字符串”,“字符串”});
i = 1: m
tmp =水果(结核病(我:)> 0)';
l =大小(tmp, 2);
gT(我“Var1”)=头(我);
gT(我,2:l + 1) = tmp;
结束
rmmissing (gT,“MinNumMissing”4)
ans =3×4表
Var1 Var2 Var3 Var4 ____ ________ _____ _____“苹果”“q1:“<失踪>“第二季”“香蕉”<失踪> <失踪>“第三季”“橙色”“猩猩”<失踪>
编辑。我帖子上面的代码后,我想到这个方法3可以精简。
第九=找到(结核病> 0);
(行,关口)= ind2sub((3、4),第九);
%然后循环通过填充最后一个表行和关口。
%我仍然不能避免循环。
2的评论
西蒙”class=
西蒙 2023年4月1日
谢谢你的快速反应。解决方案1中的结果需要更多的处理在每一行删除冗余。解决方案3的正确结果。
我真正的有成千上万的多行数据。它的第一列存储账户密码,第二列,“账户定义”,第三列是财务数值。例如,“ 1 xxxxx的代码,和资产 的是账户的定义。这两个应该有一个完美的一对一的关系。然而,由于人为因素,实际的条目的账户定义为给定帐户代码可能略有不同。例如,“资产”可以键入“资产”,或“Aset”。
代码的下游步骤是对我视觉上检查是否有任何奇怪的“账户密码”——“账户定义”。只有大约一百个独特的“账户密码”,更可以控制人类比原超高层表检查。

登录置评。

接受的答案

Stephen23”class=
Stephen23 2023年4月1日
编辑:Stephen23 2023年4月27日
使用UNSTACK非常简洁的解决方案,因为它会自动垫不同长度相同数量的列数据,根据需要添加“失踪”的价值观。这是否则难以复制。但使用UNSTACK,我们需要添加一个变量告诉UNSTACK列将数据移动到:
C = {第一季度的,第一季度的,“第二季”,“第三季”,“第三季”,“第三季”;“苹果”,“:”,“香蕉”,“橙”,“猩猩”,“橙”}';
T = cell2table (C,“VariableNames”,{“代码”,“水果”})
T =6×2表
代码 水果 ______ __________{q1的}{‘苹果’}{q1的}{':'}{q2的}{“香蕉”}{“第三季”}{“橙色”}{“第三季”}{‘猩猩’}{“第三季”}{“橙色”}
U =独特的(T,“行”);
G = findgroups (U.code);%的招待
F = @ (n) (1: nnz (n = = G))。”;%的招待
U。数= cell2mat (arrayfun (F,独特的(G),“大学”,0))%的招待
U =5×3表
代码 水果 ______ __________ _____{q1的}{‘苹果’}1 {q1的}{':'}2 {q2的}{“香蕉”}1{“第三季”}{“橙色”}1{“第三季”}{‘猩猩’}2
U = unstack (U,“水果”,“数”,“VariableNamingRule”,“修改”)
U =3×3表
代码 x1 x2 ______ __________ __________{q1的}{‘苹果’}{':'}{q2的}{“香蕉”}{0×0字符}{“第三季”}{“橙色”}{‘猩猩’}
注一:这只是给一组的每个元素的唯一索引。令人吃惊的是,似乎并不是一个简单的内置的方式实现这一目标……有人有什么建议吗?:例如[1,1,1、2、2、1]- > [1、2、3、1、2、4]。
编辑:我发现了一个简洁的方式:
G = findgroups (U.code);
U。数= grouptransform(的(大小(G)), G, @cumsum);
11日评论
Stephen23”class=
Stephen23 2023年4月27日
编辑:Stephen23 2023年4月27日
我想到另一种方法基于GROUPTRANSFORM:
如前所述在我回答,所需的转换(1,1,1、2、2、1]- > [1、2、3、1、2、4]。
G = [1; 1; 1; 2; 2; 1];%必须列向量
Y = grouptransform(的(大小(G)), G, @cumsum)
Y = 6×1
1 2 3 1 2 4
不错,这似乎是我们想要的。然而在这种情况下G幸运的是由整数1 . . N。在所有其他情况下,我们需要使用例如FINDGROUPS第一。使用的假数据,我可以试一试我的回答:
C = {第一季度的,第一季度的,“第二季”,“第三季”,“第三季”,“第三季”;“苹果”,“:”,“香蕉”,“橙”,“猩猩”,“橙”}';
T = cell2table (C,“VariableNames”,{“代码”,“水果”})
T =6×2表
代码 水果 ______ __________{q1的}{‘苹果’}{q1的}{':'}{q2的}{“香蕉”}{“第三季”}{“橙色”}{“第三季”}{‘猩猩’}{“第三季”}{“橙色”}
U =独特的(T,“行”);
G = findgroups (U.code);
U。数= grouptransform(的(大小(G)), G, @cumsum)
U =5×3表
代码 水果 ______ __________ _____{q1的}{':'}1 {q1的}{‘苹果’}2 {q2的}{“香蕉”}1{“第三季”}{‘猩猩’}1{“第三季”}{“橙色”}2
U = unstack (U,“水果”,“数”,“VariableNamingRule”,“修改”)
U =3×3表
代码 x1 x2 ______ __________ __________{q1的}{':'}{‘苹果’}{q2的}{“香蕉”}{0×0字符}{“第三季”}{‘猩猩’}{“橙色”}

登录置评。

答案(1)

彼得·珀金斯”class=
彼得·珀金斯 2023年4月5日
我不能理解欲望的输出,但其他人创造了什么本质上是一个crosstabulation计数,所以,在R2023a新
> > T = cell2table (C,“VariableNames”,{“代码”,“水果”});
> >主(T,行=“代码”列=“水果”)
ans =
3×表7
代码:苹果香蕉猩猩橙色橙子
_________________________________________
{第一季度的}1 2 0 0 0 0
{“第二季”}0 0 1 0 0 0
{“第三季”}0 0 0 1 2 1
骑自行车的人指出,有一堆空箱子,所以原来的“整洁”格式可能更有用。对我来说,这看起来像“水果应该直言,你应该申请mergecats清理那些/不同的拼写错误”。
7评论
西蒙”class=
西蒙 2023年5月13日
| >编辑:我发现了一个简洁的方式:
| > G = findgroups (U.code);
| > U。数= grouptransform(的(大小(G)), G, @cumsum);
抱歉迟到的回应。我被东西。这确实是一个非常简洁的解决方案。我曾经认为grouptransform()是它的功能非常有限。但当它是把工作放在一个虚拟/额外的变量,它可以相当多才多艺的解决问题。

登录置评。

类别

找到更多的在矩阵和数组帮助中心文件交换

下载188bet金宝搏


释放

R2023a

社区寻宝

找到宝藏在MATLAB中央,发现社区如何帮助你!

开始狩猎!