【问题标题】:How to merge rows in OpenRefine如何在 OpenRefine 中合并行
【发布时间】:2020-02-28 20:15:38
【问题描述】:

如何根据某个 ID 字段合并行?

Original Table                   New Table

ID   | Field1 | Field2       ID     | Field1 | Field2
-----|------- |--------      -------|--------|-------
A        5                    A         5        10
A                10           B         1        3
B        1                    C         4        150
B                3
C        4
C                150

我想根据某个 ID 字段标识的组中的值填充给定的单元格值。

也就是说,我想对表进行聚合,并使用每列中的非空值作为聚合函数。

【问题讨论】:

    标签: openrefine grel


    【解决方案1】:

    对于“ID”列使用“基于此列添加列”:

    filter(
      cell.cross("ProjectName", "ID").cells["Field1"].value,
      v,
      isNonBlank(v)
    )[0]
    

    这将为每行标识的 ID 设置一个值。

    Original Table      New Table
    
    ID   | Field1 | Field2 | Field1_ | Field2_
    -----|------- |--------|---------|--------
    A        5                  5        10
    A                10         5        10
    B        1                  1        3
    B                3          1        3
    C        4                  4        150
    C                150        4        150
    

    删除旧列。

    之后,通过使用“空白向下+分面空白+删除匹配行”的方法删除重复项

    【讨论】:

      【解决方案2】:

      我认为更简单的解决方案是使用:

      1° ID 列上的“编辑单元格/空白”功能,以获得如下效果:

      2° 然后在最后一列(Field2)上“编辑单元格/加入多值单元格”,这将产生:

      【讨论】:

      • 它不适用于所有“B”行的 field1 为空的情况,不是吗?
      • 啊,我明白了,“id”列应该用空格!
      • 如果你没有任何 B 的值,它只会为 B 行生成空白单元格。
      【解决方案3】:

      在 ID 列中使用菜单选项:编辑单元格 -> 空白 这应该会为您留下一个看起来像这样的表格:

      ID   | Field1 | Field2 
      -----|------- |--------
      A        5             
                       10    
      B        1             
                       3
      C        4
                       150
      

      确保您处于“记录”模式(此选项位于数据网格的左上方)。您应该会看到每个 ID 的行都分组在一起。

      现在使用编辑单元格 -> 在其他每一列上加入多值单元格 - 一旦您为所有列完成此操作,这应该会为您的每条记录留下一行

      【讨论】:

        【解决方案4】:

        它不是 OpenRefine,但我认为它对于 OpenRefine 用户来说是一个非常好的工具。你可以运行这个 Miller (https://github.com/johnkerl/miller) 命令

        mlr --csv reshape -r "Field" -o item,value \
        then filter -x -S '$value==""' \
        then reshape -s item,value input.csv
        

        拥有

        ID,Field1,Field2
        A,5,10
        B,1,3
        C,4,150
        

        首先我创建了一个整洁的数据版本 (https://vita.had.co.nz/papers/tidy-data.pdf),然后我再次将它从长格式转换为宽格式

        【讨论】:

          【解决方案5】:

          使用 cross() 函数,你也可以达到这个效果,但速度要快得多。

          它本身基本上是一个 VLOOKUP(同一记录的所有行)——跳过带有数据的行——在过滤后删除空单元格。

          filter(cross(cells.ID.value, "TEST-FillUp", "ID"), vV, vV.cells["Field1"].value != null)[0].cells.Field1.value
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2015-10-24
            • 1970-01-01
            • 2021-12-23
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多