合并多个表的数据我正在尝试通过合并两个表(或更多表)中的数据来创建一个新的主表。例如,我尝试将下面的表 A 和表 B 合并为表 AB,结果如下:



基本上,表 A 和 B 在“开始”和“结束”中都有类似的列,但每行的范围不同。我试图做的是将两个表中从起始距离 1 到 20 的段合并到表 AB 中。
关于如何通过脚本或表格功能来做到这一点,您有什么想法吗?
高级统计建模自动化和脚本内容组织大规模定制分享和交流结果Re: 合并多个表中的数据经过一番思考,我找到了一种交互方式。 我没有描述它,而是附上了我制作的一个简短的视频,讨论了这个过程。 交互式方法的优点是无论您要组合多少个表,它的工作量都是相同的(并不多)。 在我的示例中,我使用 3。 缺点是需要一些不直观的排序;如果您在排序时出错,您将得到不正确的结果。
运行此脚本以生成我在示例中使用的表:
Names Default To Here(1);
dta = new table("A",
<<ADDROWS></ADDROWS>Re: 合并多个表中的数据@jthi & @brady_brady感谢您的回复。 我确信提供的解决方案有效,但我想先消化它们,如果它们符合我的意图,我会在这里回复。 感谢帮助! 保持联系。
Re: 合并多个表中的数据编辑:我重新编写了它以使其更短,更高效并且不受我原始响应的基于整数的限制。 调整代码以处理超过 2 个源表也很简单。
////
您还可以使用 Loc Sorted() 使用 JSL 的表格查找版本来解决这个问题。
干杯,
布雷迪
Names Default To Here( 1 );
dt1 = New Table( "Table A",
Add Rows( 4 ),
Compress File When Saved( 1 ),
New Column( "Start", Numeric, "Continuous", Format( "Best", 12 ), Set Values( [1, 5, 10, 15] ) ),
New Column( "End", Numeric, "Continuous", Format( "Best", 12 ), Set Values( [5, 10, 15, 20] ) ),
New Column( "Name", Character, "Nominal", Set Values( {"A", "B", "C", "D"} ) )
);
dt2 = New Table( "Table B",
Add Rows( 5 ),
Compress File When Saved( 1 ),
New Column( "Start", Numeric, "Continuous", Format( "Best", 12 ), Set Values( [1, 4, 8, 12, 16] ) ),
New Column( "End", Numeric, "Continuous", Format( "Best", 12 ), Set Values( [4, 8, 12, 16, 20] ) ),
New Column( "Name", Character, "Nominal", Set Values( {"X1", "X2", "X3", "X4", "X5"} ) )
);
//////////// Begin processing here...
ends = Matrix( Associative Array( Concat( As List( dt1:End << get values ), As List( dt2:End << get values ) ) ) << get keys );
starts = [1] |/ ends[1 :: (N Row( ends ) - 1)];
dt3 = As Table( starts || ends, <<COLUMN names=""></COLUMN>
Re: 合并多个表中的数据这可以让您了解如何使用脚本执行此操作:
Names Default To Here(1);
dt1 = New Table("Table A",
Add Rows(4),
Compress File When Saved(1),
New Column("Start",
Numeric,
"Continuous",
Format("Best", 12),
Set Values([1, 5, 10, 15])
),
New Column("End",
Numeric,
"Continuous",
Format("Best", 12),
Set Values([5, 10, 15, 20])
),
New Column("Name", Character, "Nominal", Set Values({"A", "B", "C", "D"}))
);
dt2 = New Table("Table B",
Add Rows(5),
Compress File When Saved(1),
New Column("Start",
Numeric,
"Continuous",
Format("Best", 12),
Set Values([1, 4, 8, 12, 16])
),
New Column("End",
Numeric,
"Continuous",
Format("Best", 12),
Set Values([4, 8, 12, 16, 20])
),
New Column("Name",
Character,
"Nominal",
Set Values({"X1", "X2", "X3", "X4", "X5"})
)
);
//create collection table
dt_final = New Table("Table A-B",
Compress File When Saved(1),
New Column("Start", Numeric, "Continuous", Format("Best", 12)),
New Column("End", Numeric, "Continuous", Format("Best", 12)),
New Column("Name", Character, "Nominal")
);
For Each Row(dt1,
startVal = Column(dt1, "Start")[Row()];
endVal = Column(dt1, "End")[Row()];
nameVal = Column(dt1, "Name")[Row()];
r_dt2 = dt2 << get rows where(startVal <= :Start <= endVal | startVal <= :End <= endVal);
For(i = 1, i <= N Items(r_dt2), i++,
newEnd = Min(Column(dt2, "End")[r_dt2[i]], endVal);
newName = nameVal || " " ||Column(dt2, "Name")[r_dt2[i]];
newRow = EvalList({startVal, newEnd, newName});
dt_final << Add rows({Start = newRow[1], End = newRow[2], Name = newRow[3]});
startVal = newEnd;
endVal= Max(Column(dt2, "End")[r_dt2[i]], endVal);
);
);
Close(dt1, no save);
Close(dt2, no save);