将一列中的百分比值替换为另一列

Replace a percentage of values in a column with another

我有一个棘手的问题,也许你们中的一位可以提供帮助。

我有一列包含几个不同的值,其中之一是 "Not Available"。我想通过用 4 个新值替换那些 "Not Available" 值来创建一个计算列,比如 "Value 1"、"Value 2" 等。平均分布,即 25% 将是 "Value 1" , 25% 将是 "Value 2" 等。我非常感谢我能得到的任何帮助。我应该提到我的数据存在于 SSAS TDM 中,所以我不能使用查询编辑器。

谢谢!

下面是一些测试数据以及我想要的结果。

Example = 
DATATABLE (
    "Value", STRING,
    {
        { "Not Available" },
        { "Not Available" },
        { "Not Available" },
        { "Not Available" },
        { "Not Available" },
        { "Not Available" },
        { "Not Available" },
        { "Not Available" },
        { "Not Available" },
        { "Not Available" },
        { "Not Available" },
        { "Not Available" },
        { "Bike" },
        { "Bike" },
        { "Bike" },
        { "Bike" },
        { "Skateboard" },
        { "Skateboard" },
        { "Skateboard" },
        { "Skateboard" },
        { "Skateboard" },
        { "Skateboard" },
        { "Snowboard" },
        { "Snowboard" },
        { "Snowboard" },
        { "Snowboard" },
        { "Snowboard" },
        { "Snowboard" },
        { "Penny Board" },
        { "Penny Board" },
        { "Penny Board" },
        { "BMX" },
        { "BMX" },
        { "BMX" }
    }
)

期望的结果:

我更愿意在查询编辑器中执行此操作,因为在那里创建索引列更容易。

确保您的 table 都已加载到查询编辑器中,替换 table、Replace

let
    Source = Table.FromRows({{"Value1"},{"Value2"},{"Value3"},{"Value4"}},{"Value"}),
    #"Changed Type" = Table.TransformColumnTypes(Source,{{"Value", type text}}),
    #"Added Index" = Table.AddIndexColumn(#"Changed Type", "Index", 0, 1)
in
    #"Added Index"

还有你的例子table。

  1. 为您的示例添加索引 table。
  2. 通过对 Replace(本例中为 4)的行数取模来转换索引列。
  3. 合并 Replace 到索引上的 Example 匹配。
  4. Value 列扩展为 Value.1
  5. 添加自定义列以选择要使用的列。
  6. 清理。删除您不想保留的所有列。

这是查询的 M 代码:

let
    Source = Table.FromRows(Json.Document(Binary.Decompress(Binary.FromText("i45W8ssvUXAsS8zMSUzKSVWK1RkuIk6Z2QQZwdmJJalJ+YlFKVTn5uWXU5sXkJqXV6ngRDTfyTcCk44FAA==", BinaryEncoding.Base64), Compression.Deflate)), let _t = ((type text) meta [Serialized.Text = true]) in type table [Value = _t]),
    #"Changed Type" = Table.TransformColumnTypes(Source,{{"Value", type text}}),
    #"Added Index" = Table.AddIndexColumn(#"Changed Type", "Index", 0, 1),
    #"Calculated Modulo" = Table.TransformColumns(#"Added Index", {{"Index", each Number.Mod(_, Table.RowCount(Replace)), type number}}),
    #"Merged Queries" = Table.NestedJoin(#"Calculated Modulo",{"Index"},Replace,{"Index"},"Replace",JoinKind.LeftOuter),
    #"Expanded Replace" = Table.ExpandTableColumn(#"Merged Queries", "Replace", {"Value"}, {"Value.1"}),
    #"Added Custom" = Table.AddColumn(#"Expanded Replace", "Value2", each if [Value] = "Not Available" then [Value.1] else [Value], type text),
    #"Removed Columns" = Table.RemoveColumns(#"Added Custom",{"Index", "Value.1"})
in
    #"Removed Columns"

与其他答案一样,我假设您有一个索引替换 table。我还将假设您可以为您的 Example table 创建一个唯一索引(这是一个单独的问题)。

逻辑相同,但现在作为 DAX 计算列:

Value2 =
IF (
    Example[Value] = "Not Available",
    LOOKUPVALUE (
        'Replace'[Value],
        'Replace'[Index], MOD ( Example[Index], COUNTROWS ( 'Replace' ) )
    ),
    Example[Value]
)