выбрать значения массива строк на основе другого массива - PullRequest
0 голосов
/ 16 ноября 2018

Я могу выбрать данные, равные значению с

data = rand(1:3, 10)
value = 2
data .== value

или равно списку значений с

values = [1, 2]
in.(data, (values,))

Последний тип является общим и также работает для скаляра: in.(data, (value, )).

Однако, это работает для Int, но универсальный не работает для String значений:

data = rand(["A", "B", "C"], 10)
value = "B"
data .== value
values = ["A","B"]
in.(data, (values, ))
in.(data, (value, ))
ERROR: use occursin(x, y) for string containment

Есть ли общий способ для String с?

Для общего ввода val я сейчас пишу следующее, но я считаю, что должно быть лучшее решение.

isa(val, AbstractArray) ? in.(data, (val,)) : data .== val

Справочная информация: я создаю функцию для выбора строк в кадре данных (и что-то с ними делать), но я хочу разрешить как список значений, так и одно значение.

1 Ответ

0 голосов
/ 16 ноября 2018

Вот трюк, который стоит знать:

[x;]

Теперь - если x - массив, он останется массивом. Если x - скаляр, он станет массивом из 1 элемента. И это именно то, что вам нужно.

Так что вы можете написать

in.(data, ([val;],))

Недостаток в том, что он выделяет новый массив, но я думаю, что val невелик и не используется в критичном для производительности коде? Если код критичен к производительности, я думаю, что лучше рассматривать скаляры и массивы по отдельным ветвям.

...