【问题标题】:Google refine cross-reference between row and column谷歌优化行和列之间的交叉引用
【发布时间】:2013-01-16 05:04:55
【问题描述】:

我不确定这是否可以在 Google Refine 中实现。但基本上,我有这样的数据。

第一个表是所有用户的表。第二张表显示所有朋友。但是,在"friends" 列的第二个表中,并不是所有的 id 都存在于我想要删除的第一个表中。那么,如何在第二个表的friends 列中搜索每个id 并去掉表1 中不存在的id?

【问题讨论】:

    标签: data-cleaning openrefine


    【解决方案1】:

    将这两个表放在不同的项目中(我们称它们为Table1Table2)。

    Table2 上的friends 列:

    • 使用“拆分多值单元格”将每个值放在单独的行中
    • 将访问者列转换为数字(或反过来将 Table1 中的 user_id 转换为字符串)
    • 将“基于此列添加新列”与表达式cross(cell,'Table1','user_id').length() 一起使用

    如果没有匹配则返回 0,如果有匹配则返回 1,如果 Table1 中有重复则返回 N>1

    如果您希望数据恢复为原始格式,请设置一个构面以过滤有效性列,清除所有错误值,然后使用“连接多值单元格”来反转您之前执行的拆分操作.

    我在 OpenRefine 2.6 中使用 cross() 修复了一些缓存错误,因此如果 cross() 不起作用,请尝试停止并重新启动 Refine 服务器。

    【讨论】:

    • 嗨,顺便说一句,我忘了提到“朋友”列有大约 3000 个 id,所以当我这样做时,我得到了堆错误,即使我从 -m 6000m 开始。不确定 Google Refine 处理这么多数据是否太多?
    • 两张表的总大小是多少?细胞数?您可以做的一件事是创建一个 Table1 的变体,它仅包含 user_id 列以节省内存。此外,Refine 从内存中逐出项目并不是很激进,因此您可以重新启动服务器以确保内存中没有其他项目。
    • 第一个表只有30m,但第二个是300m,它们都只有30000条记录。我什至不能做“拆分多值单元格”。因为 Table2 列“朋友”有大约 3000 个 id。
    • 您可以使用forEach(value.split(','),v,if(<complex expression using cross>,v,null).join(',') 来拆分朋友字符串,验证每个部分,然后将其重新组合在一起,但我现在没有时间为您组合。
    • 我会试着弄清楚。非常感谢您的帮助。 :-)
    猜你喜欢
    • 1970-01-01
    • 2011-12-01
    • 1970-01-01
    • 2011-08-28
    • 1970-01-01
    • 1970-01-01
    • 2015-09-30
    • 2019-12-09
    • 1970-01-01
    相关资源
    最近更新 更多