各位,
我有包含 ID、上次检查数据和上次检查决策列的数据表。 我想将最后一次检查数据列与最后一次检查决策结合起来,以便将一列(堆叠)用于关联分析。 例如,我的数据结构的一个集群如下所示:
ID 上次检查决策 上次检查数据
101 产品规格缺陷
101 CGMP 偏差
101 21 美国联邦法规 211.113
101 奥钢联 LIQ_US
我想将上次检查决策(在本例中为 VAI)移至上次检查数据列下,并创建具有相同 ID(在本例中为 101)的新行。 因此我需要我的堆叠数据如下:
ID 最后检查数据
101 产品规格缺陷
101 CGMP 偏差
101 21 美国联邦法规 211.113
第101章
101 奥钢联
此外,这些ID中的一些在一个或多个上次检查数据中是重复的但具有不同的值。 例如,实验室缺陷可能是同一 ID 的另一个问题,因此当这些值中的任何一个与前一个值不同时,我都会创建另一个行簇。
ID 上次检查决策 上次检查数据
101 实验室缺陷
101 CGMP 偏差
101 21 美国联邦法规 211.113
101 奥钢联 LIQ_US
非常感谢您提前提供的帮助。
最好的,
盖斯
我不确定我是否理解正确,但这是另一种选择。 如果这是您想要的,您还需要看看它的扩展能力如何。
NamesDefaultToHere(1);
// Example table . . .
dt = New Table( "Inspection",
Add Rows( 10 ),
New Column( "ID",
Character,
"Nominal",
Set Values(
{"101", "101", "101", "101", "102", "102", "102", "101", "101", "101"}
)
),
New Column( "Last Inspection Decision",
Character,
"Nominal",
Set Values( {"", "", "", "VAI", "", "", "Code 1", "", "", "Code 2"} )
),
New Column( "Last Inspection Data",
Character,
"Nominal",
Set Values(
{"PRODUCT SPECIFICATIONS DEFECT", "CGMP Deviations", "21 CFR 211.113",
"LIQ_US", "PRODUCT SPECIFICATIONS DEFECT", "21 CFR 211.113", "LIQ_US",
"PRODUCT SPECIFICATIONS DEFECT", "CGMP Deviations", "21 CFR 211.113"}
)
)
);
// Copy the table
dt2 = Eval(dt << getScript);
dt2 << setName(dt << getName ||" Stacked");
// Get the values from the two columns of interest into lists
ids = Column(dt2, "ID") << getValues;
vals = Column(dt2, "Last Inspection Data") << getValues;
// Find out where we need to insert new values, get the required values, and insert them into the right positions
insertAfter = dt2 << getRowsWhere(!IsMissing(:Last Inspection Decision));
for(r=1, r<= NItems(insertAfter), r++,
InsertInto(ids, Column(dt2, "ID")[insertAfter[r]], insertAfter[r] + r);
InsertInto(vals, Column(dt2, "Last Inspection Decision")[insertAfter[r]], insertAfter[r] + r);
);
// Add rows to teh copy of the table, insert the column values, and delete the column we don't need
dt2 << addRows(NRows(insertAfter));
Column(dt2, "ID") << setValues(ids);
Column(dt2, "Last Inspection Data") << setValues(vals);
dt2 << deleteColumns(:Last Inspection Decision);
你好,
它不起作用,因为我有超过 100,000 行。 我尝试将数据分成三部分,每部分几乎有 35,000 行,但它不起作用。 有什么建议吗?
最好的,
盖斯
这不是最强大的解决方案,但请尝试一下:
dt = current data table ();
for each row( if(!is missing (:Last Inspection Decision),
dt << add rows(1, row()),
is missing (:Last Inspection Data), :Last Inspection Data[row()] = :Last Inspection Decision[row()-1])
);