根据多个列保留最新的重复行

时间:2014-05-17 21:01:35

标签: openrefine

我似乎在Open Refine(Google Refine 2.5 [r2407])中遇到了工作流问题,无法进行复杂的行清理。到目前为止,我发现的是如何根据单个列删除重复的行

我的目标是删除基于多列的重复行,最好是在特定的层次结构中。

实施例

在Refine中给出以下虚拟数据

+----+---------+---------+--------+------------+------+-----------------------------------+
| id | timeAgo |  title  | author |    date    | val1 |    [After Refine, keep Record]    |
+----+---------+---------+--------+------------+------+-----------------------------------+
|  1 |      10 | Faust   | Mr. A  | 2014-01-15 |   10 | ->B, older entry                  |
|  2 |      11 | Faust   | Mr. A  | 2014-01-21 |   10 | A (because of Date)               |
|  3 |       8 | Faust   | Mr. A  | 2014-01-15 |   10 | B                                 |
|  4 |       8 | RedHead | Mr. B  | 2014-01-21 |   34 | ->D, older entry                  |
|  5 |       7 | RedHead | Mr. B  | 2014-01-21 |   34 | ->D, same time Ago, but lower ID  |
|  6 |       7 | RedHead | Mr. A  | 2014-01-01 |   13 | C (because of author, date, val1) |
|  7 |       7 | RedHead | Mr. B  | 2014-01-21 |   34 | D                                 |
+----+---------+---------+--------+------------+------+-----------------------------------+

我想基于以下逻辑来删除重复的行。如果

  • title&& auther&&日期&& val1与
  • 相同
  • 保留最新(最少timeAgo)行,如果有多个,则
  • 保留ID最高的那个

结果将是:

+---------+----+---------+---------+--------+------------+------+
| Refined | id | timeAgo |  title  | author |    date    | val1 |
+---------+----+---------+---------+--------+------------+------+
| A       |  2 |      10 | Faust   | Mr. A  | 2014-01-21 |   10 |
| B       |  3 |       8 | Faust   | Mr. A  | 2014-01-15 |   10 |
| C       |  6 |       7 | RedHead | Mr. A  | 2014-01-01 |   13 |
| D       |  7 |       7 | RedHead | Mr. B  | 2014-01-21 |   34 |
+---------+----+---------+---------+--------+------------+------+

简单方法?

如果没有其他解决方案,我还是谢谢你选择一个脚本/ GREL。

但是可以通过Refines着名的工作流程“录制”来实现上述逻辑,那么它可以被提取并应用于其他相同格式的数据集吗?

我背后的动机是让员工更加周到地使用数据(超越excel),但不要使用完整的脚本语言立即与他们对抗。

1 个答案:

答案 0 :(得分:0)

这听起来像是一个简单的排序问题。

  1. 按标题,作者,时间和ID
  2. 对记录进行排序
  3. 永久重新订购行(重要 - 如果您忘记此步骤,它将无法正常工作)
  4. 标题&作者
  5. 将这两列移至最左边的两个位置
  6. 在剩余列上加入多值单元格
  7. 使用value.split(',')[0]转换步骤5中的所有列,以提取第一个值(如果按正确的顺序对其进行排序,则应该是所需记录的值