如何将数据从长格式转换为宽格式?我是 JMP 新用户。
我的数据目前是长格式。 换句话说,每个受试者都有多行数据。 但是,我需要宽格式的数据进行生存分析 - 每个受试者 1 行数据。 当我尝试使用转置时,JMP 告诉我“无法转置。 数据列有不同的数据类型”。 这些变量是连续变量和名义变量的混合。 那么,我该怎么做呢? 我能够毫无困难地将不同的数据集从宽数据集转换为长数据集,但似乎无法做相反的事情。
当前数据设置如下(假数据):
ID Var1 Var2 结果
001 1 1 0
001 1 1 0
001 1 0 1
002 0 1 0
002 0 1 1
003 1 1 0
我想要这样的:
ID Var1_time1 Var2_time1 Var1_time2 Var2_time2.... 结果_timex
001 1 1 1 1 1
002 0 1 0 1 1
003 1 1 。 。 0
谢谢!
回复:如何将数据从长格式转换为宽格式?谢谢,杰夫! 成功了!回复:如何将数据从长格式转换为宽格式?@ron_horne有正确的解决方案,但也许一些图片会有所帮助。
表 -> 拆分将按照您想要的方式重新排列数据,但它需要一个标识新列的列。 在您的情况下,您想要为 ID 中的每一行创建列,因此您需要一个对 ID 中的行进行计数的列。@ron_horne称为此专栏指数。
您还需要确保您的数据按以下顺序排序ID为了这个工作。
以下是您在第一篇文章中以 JMP 数据表形式提供的数据。

对于这些数据,我们需要添加指数柱子。@ron_horne他的索引列使用了不同的公式,但我喜欢更简单的公式。

上面的公式是:
If( :ID != Lag( :ID, 1 ), 1, Lag( :Index, 1 ) + 1)
在散文中,这表示如果当前行中的 ID 值与前一行中的 ID 不同(即滞后 (:ID, 1) )然后将 1 放入指数列,否则取值指数上一行的列(即滞后(:索引,1) )
如您所见,指数数据表中的列现在计算其中的行数ID 。

现在我们可以使用表格->拆分分割你的变量1 ,变量2和结果列按指数并将行分组为ID 。

这会给你这个数据表,我认为这就是你想要的。 它为 ID 中的每一行添加新列,并且每个 ID 一行。

看一个更简单的示例可能会更容易,其中我们没有创建“拆分依据”列。 这是一个视频展示了这一点。
如果我没有抓住重点或者你仍然感到困惑,请告诉我。
回复:如何将数据从长格式转换为宽格式?最后的机会,
1)第一个命令只是以长格式创建原始数据源。
2) 第二条命令为每个 ID 的事件编号引入索引。每个 ID 的事件数量不需要相等。但是,如果某些 ID 的事件较少,它们将在宽表格式中缺少值。
3) 第三个命令利用索引和 ID 列来按照您要求的方式拆分表。每个事件和变量占一列,每一行仅代表一个 ID。
对于您的数据,您只需要运行最后两个命令。
names default to here(1);
// source data table
dt = New Table( "Long",
Add Rows( 7 ),
New Column( "ID",
Numeric,
Continuous,
Format( "Best", 5 ),
Set Values( [1, 1, 1, 2, 2, 3, 3] )
),
New Column( "Var1",
Numeric,
Continuous,
Format( "Best", 12 ),
Set Values( [1, 1, 1, 0, 0, 1, 1] )
),
New Column( "Var2",
Numeric,
Continuous,
Format( "Best", 12 ),
Set Values( [1, 1, 0, 1, 1, 1, 0] )
),
New Column( "Outcome",
Numeric,
Continuous,
Format( "Best", 12 ),
Set Values( [0, 0, 1, 1, 1, 0, 0] )
)
);
// add index column for spliting - no need to sort the table first
dt << new column ("index", formula(Sum( :ID[Index( 1, Row() )] == :ID ) ) );
// now split by index and group by ID
dt << Split(
Split By( :index ),
Split( :Var1, :Var2, :Outcome ),
Group( :ID ),
Output Table( "Wide" )
);
回复:如何将数据从长格式转换为宽格式?这段代码给了我两张表。 第一个称为“源”,只有 10 行数据和 5 列。 ID 列从 1 到 4(不是我的 ID),ID 出现在 3 行上。 我真的不知道这应该做什么。 所有数据都是二进制的,甚至是我的日期变量。 第二个表“无标题”有 4 行数据和 4 列。 ID 从 1-4 往下,行和列都标记为缺失。
我不认为这正在做我想做的事。
回复:如何将数据从长格式转换为宽格式?如果您按原样运行整个脚本并且结果就是您正在寻找的结果,那么您只需单击几下即可在数据集上重现它。
1)添加一个新列并将其命名为“index”。
2) 将其公式设置为: Sum( :ID[Index( 1, Row() )] == :ID )
3)表格>>拆分并按原样填充。

单击“确定”即可完成。
最好的,
罗恩
回复:如何将数据从长格式转换为宽格式?好的,我是 JMP 新手,从未使用过 JSL,尽管我已经在 SPSS、SAS 和其他一些软件中完成了大量编程。 在这个例子中,我根本没有遵循脚本,尤其是“设置值”。 我认为下一个命令块是尝试创建新的索引变量,以便在拆分之前进行分组。
在另一个数据集中从宽到长时,我创建了一些变量,但在这种情况下,每个主题都有相同数量的观察结果。
回复:如何将数据从长格式转换为宽格式?抱歉没有先仔细检查。
尝试以下操作
名称默认为此处( 1 ) ;
// 源数据表
dt = 新表( “来源”,
添加行( 10 ) ,
新专栏( “ID ”,
数字,
连续的,
格式( “最好的”, 5 ) ,
设定值( [ 1 , 1 , 1 , 2 , 2 , 3 , 3 , 4 , 4 , 4 ] )
) ,
新专栏( “变量1”,
数字,
连续的,
格式( “最好的”, 12 ) ,
设定值( [ 1 , 1 , 1 , 0 , 0 , 1 , 1 , 0 , 1 , 0 ] )
) ,
新专栏( “变量2”,
数字,
连续的,
格式( “最好的”, 12 ) ,
设定值( [ 1 , 1 , 0 , 1 , 1 , 1 , 0 , 1 , 1 , 0 ] )
) ,
新专栏( “结果”,
数字,
连续的,
格式( “最好的”, 12 ) ,
设定值( [ 0 , 0 , 1 , 1 , 1 , 0 , 0 , 1 , 1 , 1 ] )
)
) ;
// 添加用于拆分的索引列 - 无需先对表进行排序
dt <<新专栏( “指数”,公式(和( :ID [指数( 1 , 排() )] ==:ID ) ) ) ;
// 现在按索引拆分并按 ID 分组
dt <<分裂(
分割依据( :指数) ,
分裂( :Var1, :Var2, :结果) ,
团体( :ID )
) ;
回复:如何将数据从长格式转换为宽格式?我不确定接下来会发生什么。 数据按 ID 排序。 当我按 ID 拆分并使用变量作为“拆分列”时,我最终得到 14 行数据和每个 id/变量组合的一列。
我试图得到:
ID 访问1 访问2 .... 访问13 结果1 结果2 ... 结果13
001 9/13 10/20 ... 3/2 0 0 ... 1
002 7/04 8/12 ... 12/5 0 1 ... 1
我得到的是
日期1-ID001 日期1-ID002
第1号线 9/13 7/04
第2号线 10/20 8/12
谢谢,
乔
回复:如何将数据从长格式转换为宽格式?
哎呀.....我想如果你使用组并将你的 ID 列也放在那里,你就可以解决这个问题
如果您的数据按 ID 排序(给定 ID 的所有数据都在一起)。 如果没有排序,则进入Tables==>Sort,按照ID对数据进行排序。 然后选择它作为“分割依据”列,选择 Var1、Var2、结果作为“分割列”,您将得到一个数据表,每个分割依据列的值一行,然后您将得到 Var1 001、Var1 002 ......Var1 013,Var2 001,Var2 002......Var2 013,结果001,结果002......结果013。
鉴于您最多可以有 13 个级别。
回复:如何将数据从长格式转换为宽格式?谢谢,罗恩,但我不会做简单的总结。 我正在做生存分析。 我的第一步是将数据转换为宽格式。
乔回复:如何将数据从长格式转换为宽格式?谢谢,吉姆。 这部分奏效了。 然而,我最终得到的是 14 行数据,并且每个变量名称都附加了主题 ID,而不是为每个对象 ID (n=15,000) 获取一行。
我的数据是按SubjectID组织的。 其中,受试者每次访问都可以有多行数据(治疗代码)。 在长格式中,每个主题有 1-13 行数据。
是否应该使用多个“分割”变量? 应该使用“分组依据”吗?
谢谢,
乔
回复:如何将数据从长格式转换为宽格式?吉姆是对的。 然而,如果您这样做只是为了生成每个 ID 的数据摘要,则可以使用表 >>> 摘要来保存此步骤。
最好的,
罗恩
回复:如何将数据从长格式转换为宽格式?你想做的是使用
表格==>拆分
您可以按 ID 拆分并指定 var1、var2 和结果作为拆分列回复:如何将数据从长格式转置为宽格式?我知道这是一个老话题,但我有一个问题。这对我来说是有效的,只是当我尝试创建索引列时,第一个 ID 是空白的。它看起来是这样的。
有谁知道这可能是什么原因造成的?

回复:如何将数据从长格式转置为宽格式?这是一种获得你想要的东西的方法
If( Row() == 1,
theVal = 1,
If( Lag( :yourColumn ) != :yourColumn,
theVal
++)
);
theVal;
回复:如何将数据从长格式转置为宽格式?你好呀,
我应该把这个公式放在哪里?在同一个 Index 列中吗?我需要将“yourColumn”更改为其他内容吗?
回复:如何将数据从长格式转置为宽格式?我指定的公式将被放置在索引列中。
需要将“yourColumn”更改为列的名称,以便在列更改时增加 Index 列的值。