如何在OpenRefine中合并行

时间:2019-11-03 05:52:16

标签: openrefine grel

如何根据某些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字段标识的组中的值来填充给定的单元格值。

也就是说,我要聚合表并在每列中使用非空值作为聚合函数。

5 个答案:

答案 0 :(得分:1)

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

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

enter image description here

2°,然后仅在最后一列(字段2)上“编辑单元格/加入多值单元格”,这将产生以下结果:

enter image description here

答案 1 :(得分:1)

在ID列中,使用菜单选项:Edit Cells-> Blank down 这应该给您留下一个看起来像这样的表:

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

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

现在使用“编辑单元格”->在其他各列上连接多值单元格-对所有列完成此操作后,每条记录将只留下一行

答案 2 :(得分:0)

对于“ 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

删除旧列。

此后,请使用“空白+刻面为空白+删除匹配的行”方法删除重复项

答案 3 :(得分:0)

这不是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)版本,然后再将其从长格式转换为宽格式

答案 4 :(得分:0)

使用cross()函数,您也可以实现此结果,但速度要快得多。

从根本上说,它本身就是一个VLOOKUP(同一记录的所有行),即跳过包含数据的行,这些数据经过过滤以删除空单元格。

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