数据清理:如何将名称略有不同且数据不相交的几列合并为一列?我有一个导出的 CSV,它是由两个或多个不同来源形成的,这些来源的列名略有不同。
没有一行包含多于一列的数据。如下面的屏幕截图所示:

我如何将它们全部合并到一列中?
一个想法是使用
Combine Columns()
这将产生一个多重响应列,但由于数据不相交,因此整个列中只有一个数字。然后强制数据类型为数字,建模类型为连续。但它会产生警告\错误。
有没有更干净的方法可以做到这一点?
自动化和脚本基础数据分析与建模回复:数据清理:如何将名称略有不同且数据不相交的几列合并为一列?我会这样处理
Names Default To Here( 1 );
dt = Current Data Table();
For Each Row(
:AA bb = Sum( :AA bb, :AA_bb_ )
);
使用 Sum() 函数会忽略缺失值,因此您将得到想要的值。
回复:数据清理:如何将名称略有不同且数据不相交的几列合并为一列?吉姆,
多谢。
我将使用这个解决方案。
我现在正在尝试编写脚本,以便列名不是硬编码的。
我不太清楚为什么我会收到这个错误:
For Each Row(
Column("AA bb") = 1234;
//Sum( :AA bb, :AA _bb_ )
);错误是:
尝试在访问或评估“Assign”时分配给第 1 行的非 L 值对象,Column(“AA bb”) = /*###*/1234 /*###*/
回复:数据清理:如何将名称略有不同且数据不相交的几列合并为一列?想法是编写一个函数并将一个字典提供给该函数。
像这样:
Names Default To Here( 1 );
dt = Current Data Table();
dict = {"AA bb", "AA _bb_"};
For Each Row(
Column(dict[1]) = Sum( Column(dict[1]), Column(dict[2]) )
);仅此变体会出现以下错误:
在访问或评估“Sum”时,需要参数为第 1 行的标量、矩阵或列表,Sum/*###*/(Column( dict[1] ), Column( dict[2] ))
我永远无法理解这样一个事实:Column() 有时按预期工作,有时却不按预期工作。有时我需要使用 As Column()。有时则需要其他东西。
PS As Column() 有效。有人能解释一下 Column() 和 As Column() 之间的区别吗?
回复:数据清理:如何将名称略有不同且数据不相交的几列合并为一列?好的,我的最终代码片段在这里:
Names Default To Here( 1 );
dt = Current Data Table();
dict = {"AA bb", "AA _bb_"};
sumExpr = Expr( Sum() );
For Each( {value, index}, dict,
Insert Into( sumExpr, Name Expr( As Column( value ) ) )
);
Eval(
Substitute(
Expr(
For Each Row(
As Column( dict[1] ) = placeholder
)
),
Expr( placeholder ), Name Expr( sumExpr )
)
);
有什么方法可以改善它吗?
回复:数据清理:如何将名称略有不同且数据不相交的几列合并为一列?这比需要的稍微复杂一点。这段代码也可以工作,不需要太多思考。如果需要,它将接受两个以上的列名。
Names Default To Here( 1 );
dt = Current Data Table();
dict = {"AA bb", "AA _bb_"};
For Each Row( dt,
As Column(dict[1]) = Sum( Transform Each( {v, i}, dict, As Column( v ) ) )
);回复:数据清理:如何将名称略有不同且数据不相交的几列合并为一列?Column() 指的是列对象,而 As Column() 指的是当前 Row() 中该列的值。
回复:数据清理:如何将名称略有不同且数据不相交的几列合并为一列?我的下一次迭代将考虑列名存在于字典中但不存在于表中的情况:
Names Default To Here( 1 );
dt = Current Data Table();
dict = {"AA bb", "AA _bb_", "AA cc"};
sumExpr = Expr( Sum() );
For Each( {value, index}, dict,
If( Try( Column( value ) << Get Name, "nocolumn" ) != "nocolumn",
Insert Into( sumExpr, Name Expr( As Column( value ) ) )
)
);
Name Expr(sumExpr);
Try(
Eval(
Substitute(
Expr(
For Each Row(
As Column( dict[1] ) = placeholder
)
),
Expr( placeholder ), Name Expr( sumExpr )
)
),
Write("No columns found")
)
使用 Transform Each 时您将如何做到这一点?
回复:数据清理:如何将名称略有不同且数据不相交的几列合并为一列?尝试使用连接工具:
创建一个包含两个变量的新列
右键单击该列
选择“公式”以打开公式编辑器。
在公式编辑器中,转到左侧的函数列表。
在“字符”下,找到并选择“连接”。
将第一列拖拽或选择到 Concatenate 函数的第一个参数框中。
将第二列拖动或选择到下一个参数框中。
单击“确定”或“应用”以创建新的组合列。
回复:数据清理:如何将名称略有不同且数据不相交的几列合并为一列?我只需添加一个 Try()。
Names Default To Here( 1 );
dt = Current Data Table();
dict = {"AA bb", "AA _bb_", "AA cc"};
For Each Row( dt, As Column( dict[1] ) = Sum( Transform Each( {v, i}, dict, Try( As Column( v ), . ) ) ) );