#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 │
│ │ String │ String │ String │
├──────┼────────┼───────────────────┼───────────────────┤
│ 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. может быть, добавить точку перед => ?