Как заменить подстроку в столбце DataFrame на переменный шаблон в Julia?

#replace #julia

#заменить #джулия

Вопрос:

Предположим, у меня есть DataFrame с двумя столбцами — gibberish и letter . Я хочу заменить подстроки gibberish так, чтобы оставались только те, которые совпадают letter , например, если gibberish is "kjkkj" и letter is "j" , которые я хочу gibberish равнять "jj" .

Фрейм данных определяется как:

 df = DataFrame(gibberish = ["dqzzzjbzz", "jjjvjmjjkjjjjjjj", "mmbmmlvmbmmgmmf"], letter = ["z", "j", "m"])
 

Если бы у меня не letter было переменной и я хотел, чтобы, скажем, «x» оставалось, я бы сделал:

 df.gibberish.= replace.(gibberish, r"[^x;]" => "")
 

и это работает нормально, но когда я пытаюсь сделать то же самое, но помещаю letter столбец в качестве переменной в выражение регулярного выражения, он просто ломается.
Я попытался сделать это с «обычными» фреймами данных.jl-способом и с помощью ярлыка DataFramesMeta.jl @transform :

 df.gibberish.= replace.(gibberish, Regex(join(["[^", letter, ";]"])) => "")
 

что приводит к ошибке

 ERROR: UndefVarError: letter not defined
 

в то время @transform как способ просто ничего не делает:

 julia> @transform(df, filtered = replace(:gibberish, Regex.(join(["[^", :letter, ";]"])) => ""))
3×3 DataFrame
│ Row  │ letter │ gibberish         │ filtered          │
│      │ StringStringString            │
├──────┼────────┼───────────────────┼───────────────────┤
│ 1    │ z      │ dqzzzjbzz         │ dqzzzjbzz         │
│ 2    │ j      │ jjjvjmjjkjjjjjjj  │ jjjvjmjjkjjjjjjj  │
│ 3    │ m      │ mmbmmlvmbmmgmmf   │ mmbmmlvmbmmgmmf   │
 

Я очень новичок в Julia, и я, вероятно, упускаю что-то очень простое, но правильное решение просто ускользает от меня.
Как мне решить эту проблему, кроме написания последовательного цикла, который был бы ужасно неэффективным?

Комментарии:

1. Предоставьте более полный, воспроизводимый код, чтобы получить более качественную справку. Например, ваш вопрос не показывает, что вы определили letter — определено ли оно где-нибудь?

2. Я добавил немного кода о том, как он определяется.

Ответ №1:

 replace.(gibberish, Regex(join(["[^", letter, ";]"]))
 

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

Вы могли бы попробовать что-то вроде

 Regex.(string.("[^" .* df.letter .* ";]"))
 

для построения массива регулярных выражений с использованием строки фрейма данных в качестве входных данных.

Комментарии:

1. Я пытался сделать df.filtered = replace.(df.gibberish, Regex.(string.("[^" .* gibberish.letter .* ";]")) => "") , но получил ошибку ERROR: MethodError: no method matching findnext(::Array{Regex,1}, ::String, ::Int64)

2. может быть, добавить точку перед => ?