大家好,
我的问题是双重的。 我的数据看起来像这样:
| 1-A | X | y | 。 | 。 | 。 | 。 |
| 1-A | 。 | 。 | z | q | 。 | 。 |
| 1-A | 。 | 。 | 。 | 。 | w | w |
| 2-B | y | w | 。 | 。 | 。 | 。 |
| 2-B | 。 | 。 | t | y | 。 | 。 |
| 2-B | 。 | 。 | 。 | 。 | q | p |
我想 A) 删除空数据点,B) 根据每行共有的第一列中的标识符(即 1-A 和 2-B)合并行。
我希望我的最终结果如下所示:
对于具有数百个值的大表,有人对解决此问题有任何建议吗?
提前致谢,
查理
是时候出动大枪了。这是一个应该可以工作的脚本。基本上它的工作方式是迭代所有行和列。如果下一行具有相同的 ID,则会将非缺失值传递到下一行。在给定 ID 的最后一行,所有非缺失值都应位于该行中。在最后一步中,您删除所有多余的行。
dt = Current Data Table();
dt << New Column( "Delete Later", character, formula( If( :ID[Row()] == :ID[Row() + 1], "Yes", "No" ) ) );
for(i=1,i<=N Row(dt),i++, //iterate through each row
//If next row has same ID, pass non-missing values down to next row
If(:Delete Later[i] == "Yes",
for(j=2,j<= (N Col(dt) - 1),j++, //iterate through each column (except ID and Delete Later)
//pass non-missing data down to next row
if(!isMissing(Column(dt,j)[i]), Column(dt,j)[i+1] = Column(dt,j)[i])
)
)
);
//Collapse all the extra rows
dt << Select Where(:Delete Later == "Yes") << Delete Rows();
这非常适合您的示例。它应该适用于您的表,但如果您有数百万行,则可能需要很长时间才能完成。此脚本还假设该列名为“ID”,并且所有其他列的每个 ID 仅具有 1 行的非缺失值。
我用来测试脚本的起始表:
决赛桌:
重新创建我的起始表的脚本:
New Table( "ConsolidateTable",
Add Rows( 6 ),
New Column( "ID",
Character( 3 ),
"Nominal",
Set Values( {"1-A", "1-A", "1-A", "2-B", "2-B", "2-B"} ),
Set Display Width( 87 )
),
New Column( "Column 2",
Character( 16 ),
"Nominal",
Set Values( {"x", "", "", "y", "", ""} ),
Set Display Width( 87 )
),
New Column( "Column 3",
Character( 16 ),
"Nominal",
Set Values( {"y", "", "", "w", "", ""} ),
Set Display Width( 87 )
),
New Column( "Column 4",
Character( 16 ),
"Nominal",
Set Values( {"", "z", "", "", "t", ""} ),
Set Display Width( 87 )
),
New Column( "Column 5",
Character( 16 ),
"Nominal",
Set Values( {"", "q", "", "", "y", ""} ),
Set Display Width( 87 )
),
New Column( "Column 6",
Character( 16 ),
"Nominal",
Set Values( {"", "", "w", "", "", "q"} ),
Set Display Width( 87 )
),
New Column( "Column 7",
Character( 16 ),
"Nominal",
Set Values( {"", "", "w", "", "", "p"} ),
Set Display Width( 87 )
)
)不幸的是,该表有超过 1000 列。 谢谢你的建议,但这似乎不太可行。
现在,假设我想忽略空白数据并在以后处理它们。 我将如何合并行?希望这一步更加可行。
如果您没有太多列,您可以先将它们全部设为字符,然后使用我推荐的步骤,然后将数字列转换回来。如果您的表格比您的示例宽得多,则这可能不太可行。
不幸的是,数据是混合的:分类数据、二进制数据、数字数据、自由文本数据。 我希望简化数据库并删除不必要的空白条目。 感谢您的建议,但我认为它不适用于这种情况。
感谢您的及时回复。 我应该补充一点,我已经掩盖了实际表格中的大部分细节 - 例如,当我尝试步骤 #1 时,JMP 告诉我“无法堆叠。 堆叠列具有不同的数据类型”。
有没有办法堆叠各种数据类型的列?
最轻松的方法是:
1. 堆叠除 ID 列之外的所有这些列,以便将它们全部合并到单个数据列中(生成的标签列保持可追溯性)。
2. 删除新数据列中所有缺失值的行。 简单方法:选择缺失值>右键单击它>选择匹配单元格>右键单击>删除行。
3. 进行表拆分以恢复数据表的原始形状。 拆分列是新的数据列。 Split By 是新的标签列,您可以按 ID 列进行分组。