OpenRefine:select 值基于另一列的变量
OpenRefine: select value based on a variable another column
我对 OpenRefine 有疑问。我正在添加一个基于 url 的新列,并从那里调用 API 以从受控词汇表 (AAT) 中获取一些术语。
我解析结果并获得多值单元格,例如:
http://vocab.getty.edu/aat/300041366||aquatints (prints)::http://vocab.getty.edu/aat/300053242||aquatint (printing process)::http://vocab.getty.edu/aat/300191265||dust bags::http://vocab.getty.edu/aat/300191278||dust boxes::http://vocab.getty.edu/aat/300191278||dust boxes::http://vocab.getty.edu/aat/300191278||dust boxes::http://vocab.getty.edu/aat/300249564||aquatinters::http://vocab.getty.edu/aat/300249564||aquatinters::http://vocab.getty.edu/aat/300249564||aquatinters::http://vocab.getty.edu/aat/300249564||aquatinters::http://vocab.getty.edu/aat/300053242||aquatint (printing process)::http://vocab.getty.edu/aat/300041366||aquatints (prints)::http://vocab.getty.edu/aat/300041368||sandpaper aquatints::http://vocab.getty.edu/aat/300041368||sandpaper aquatints
我有当前结构的地方:
URI||Corresponding_TERM::URI||Corresponding_TERM
等等
我现在需要选择其中一条记录。我的解决方案是使用
value.split("::")[0]
以便选择我想要的元素。
不幸的是,这个解决方案有非常明显的缺点,因为数组中元素的顺序不是恒定的,所以如果第一个元素 [0] 对一个记录来说是正确的,它可能不适合下一个记录。
为了更好地说明自己,我现在有这样的结构
-----------------------------------------------------------
|ID | Classification | Term_From_Thesaurus |
| 1 | Aquatints | uri||term1::uri||term2:: |
| 1 | Aquatints | uri||term1::uri||term2:: |
| 2 | Drypoints | uri||term3::uri||term4:: |
| 3 | Woodcut | uri||term5::uri||term6::uri||term7 |
-----------------------------------------------------------
我需要将第 1 学期与 Aquatints 关联,第 4 学期与 Drypoints 关联,第 7 学期与 Woodcut 关联。
我该怎么做?
一种解决方案可能是使用 facet 和大量手动工作,但也许有更好的解决方案?
去每条记录怎么样,如果 ID = 1 他们应该使用 term1,如果 ID = 2 应该使用 term 4 等等。这可能吗?我真的不知道如何使用另一列的值作为变量来确定操作的结果。 cell.cross 会有所帮助,但如果我需要将数据分成两个文件,并且在我看来这不是一个合适的解决方案..
如果您必须根据自己对该领域的知识自己选择正确的术语,我看不出如何使操作自动化。这是一个解决方案,可以将 "Classification" 列中的每个术语与 API.
返回的术语中最相似的那个匹配。
使用的 Grel 公式是:
value.fingerprint() == cells.terms.value.replace(/\(.+\)/,'').fingerprint()
所以我不确定我是否正确理解了你的问题,但 可以 "select value based on a variable in another column"。
如果你有:
-----------------------------------------------------------
|ID | Classification | Term_From_Thesaurus |
| 1 | Aquatints | uri||term1::uri||term2:: |
| 1 | Aquatints | uri||term1::uri||term2:: |
| 2 | Drypoints | uri||term3::uri||term4:: |
| 3 | Woodcut | uri||term5::uri||term6::uri||term7 |
-----------------------------------------------------------
那么如果你把'Term_From_Thesaurus'列拆分成一个数组,那么你就可以用'ID'列中的数字来select数组中的相关条目。但是,请注意,要使其正常工作,您需要将 ID 列中的数字转换为数字类型(如果尚未转换)。在此示例中,我假设 ID 列中的数字以字符串而不是数字开头。
所以公式:
value.split("::")[cells.ID.value.toNumber()-1]
将找到第一行和第二行的第一个值,第三行的第二个值和第四行的第四项。这在此处说明:
公式分解如下:
- value.split("::") = 将 URI/Term 对的列表拆分为数组
- cells.ID.value.toNumber() = 将ID列中的值转换成
数字类型
- -1 = 因为数组成员从零开始计数
希望这是清楚的
我对 OpenRefine 有疑问。我正在添加一个基于 url 的新列,并从那里调用 API 以从受控词汇表 (AAT) 中获取一些术语。 我解析结果并获得多值单元格,例如:
http://vocab.getty.edu/aat/300041366||aquatints (prints)::http://vocab.getty.edu/aat/300053242||aquatint (printing process)::http://vocab.getty.edu/aat/300191265||dust bags::http://vocab.getty.edu/aat/300191278||dust boxes::http://vocab.getty.edu/aat/300191278||dust boxes::http://vocab.getty.edu/aat/300191278||dust boxes::http://vocab.getty.edu/aat/300249564||aquatinters::http://vocab.getty.edu/aat/300249564||aquatinters::http://vocab.getty.edu/aat/300249564||aquatinters::http://vocab.getty.edu/aat/300249564||aquatinters::http://vocab.getty.edu/aat/300053242||aquatint (printing process)::http://vocab.getty.edu/aat/300041366||aquatints (prints)::http://vocab.getty.edu/aat/300041368||sandpaper aquatints::http://vocab.getty.edu/aat/300041368||sandpaper aquatints
我有当前结构的地方:
URI||Corresponding_TERM::URI||Corresponding_TERM
等等
我现在需要选择其中一条记录。我的解决方案是使用
value.split("::")[0]
以便选择我想要的元素。
不幸的是,这个解决方案有非常明显的缺点,因为数组中元素的顺序不是恒定的,所以如果第一个元素 [0] 对一个记录来说是正确的,它可能不适合下一个记录。
为了更好地说明自己,我现在有这样的结构
-----------------------------------------------------------
|ID | Classification | Term_From_Thesaurus |
| 1 | Aquatints | uri||term1::uri||term2:: |
| 1 | Aquatints | uri||term1::uri||term2:: |
| 2 | Drypoints | uri||term3::uri||term4:: |
| 3 | Woodcut | uri||term5::uri||term6::uri||term7 |
-----------------------------------------------------------
我需要将第 1 学期与 Aquatints 关联,第 4 学期与 Drypoints 关联,第 7 学期与 Woodcut 关联。
我该怎么做? 一种解决方案可能是使用 facet 和大量手动工作,但也许有更好的解决方案? 去每条记录怎么样,如果 ID = 1 他们应该使用 term1,如果 ID = 2 应该使用 term 4 等等。这可能吗?我真的不知道如何使用另一列的值作为变量来确定操作的结果。 cell.cross 会有所帮助,但如果我需要将数据分成两个文件,并且在我看来这不是一个合适的解决方案..
如果您必须根据自己对该领域的知识自己选择正确的术语,我看不出如何使操作自动化。这是一个解决方案,可以将 "Classification" 列中的每个术语与 API.
返回的术语中最相似的那个匹配。使用的 Grel 公式是:
value.fingerprint() == cells.terms.value.replace(/\(.+\)/,'').fingerprint()
所以我不确定我是否正确理解了你的问题,但 可以 "select value based on a variable in another column"。
如果你有:
-----------------------------------------------------------
|ID | Classification | Term_From_Thesaurus |
| 1 | Aquatints | uri||term1::uri||term2:: |
| 1 | Aquatints | uri||term1::uri||term2:: |
| 2 | Drypoints | uri||term3::uri||term4:: |
| 3 | Woodcut | uri||term5::uri||term6::uri||term7 |
-----------------------------------------------------------
那么如果你把'Term_From_Thesaurus'列拆分成一个数组,那么你就可以用'ID'列中的数字来select数组中的相关条目。但是,请注意,要使其正常工作,您需要将 ID 列中的数字转换为数字类型(如果尚未转换)。在此示例中,我假设 ID 列中的数字以字符串而不是数字开头。
所以公式:
value.split("::")[cells.ID.value.toNumber()-1]
将找到第一行和第二行的第一个值,第三行的第二个值和第四行的第四项。这在此处说明:
公式分解如下:
- value.split("::") = 将 URI/Term 对的列表拆分为数组
- cells.ID.value.toNumber() = 将ID列中的值转换成 数字类型
- -1 = 因为数组成员从零开始计数
希望这是清楚的