OpenRefine: выбрать значение на основе переменной другого столбца
У меня проблема с 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 с акватинтами, термин 4 с сухими точками и термин 7 с гравюрой на дереве.
Как я могу это сделать? Решением может быть использование фасета и много ручной работы, но, может быть, есть лучшее? Как насчет перехода к каждой записи, и если ID = 1, они должны использовать термин 1, если ID=2 следует использовать термин 4 и т. Д. Будет ли это возможно? Я искренне не знаю, как использовать значение другого столбца в качестве переменной для определения результата операции. cell.cross помог бы, но в случае, если мне нужно разделить данные на два файла, и это не кажется мне правильным решением..
2 ответа
Поэтому я не уверен, правильно ли я понял ваш вопрос, но можно "выбрать значение на основе переменной в другом столбце".
Если у вас есть:
-----------------------------------------------------------
|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", чтобы выбрать соответствующую запись в массиве. Тем не менее, обратите внимание, что для этого вам нужно иметь номер в столбце ID для преобразования в тип Number (если это еще не сделано). В этом примере я предполагаю, что число в столбце идентификатора начинается со строки, а не числа.
Итак, формула:
value.split("::")[cells.ID.value.toNumber()-1]
Найдет первое значение в первой и второй строке, второе значение в третьей строке и 4-й элемент в 4-й строке. Это показано здесь:
Формула разбивается следующим образом:
- value.split ("::") = разбивает список пар URI/Term в массив
- cell.ID.value.toNumber() = преобразует значение в столбце ID в числовой тип
- -1 = потому что члены массива отсчитываются от нуля
Надеюсь это понятно
Если вам нужно выбрать правильный термин в соответствии с вашими знаниями в этой области, я не вижу, как автоматизировать операцию. Вот решение, позволяющее сопоставить каждый термин в столбце "Классификация" с тем, который больше всего похож на него среди терминов, возвращаемых API.
Используемая формула Греля:
value.fingerprint() == cells.terms.value.replace(/\(.+\)/,'').fingerprint()