У меня есть фрейм данных с некоторыми повторяющимися значениями в одном из столбцов:
df = DataFrame(A=["a","a","b"])
Что я хотел бы сделать, так это заменить все значения уникальными значениями и добавочным порядком, если есть повторяющиеся значения, например:
df = DataFrame(A=["a_1","a_2","b_1"])
Я знаю, что в R это можно сделать с помощью make.unique, но есть ли аналогичная функция в Julia?





Если вам нужен именно этот вывод, насколько я могу судить, для этого нет готовой функции, но вы можете сделать, например.
julia> transform(groupby(df, :A), :A => (x -> string.(x, "_", 1:length(x))) => :A_unique)
3×2 DataFrame
Row │ A A_unique
│ String String
─────┼──────────────────
1 │ a a_1
2 │ a a_2
3 │ b b_1
Другим способом может быть создание пользовательской функции uniquify для этой цели:
function uniquify(v)
d = Dict{eltype(v),Int}()
return map(v) do e
d[e] = tmp = get(d, e, 0)+1
return "$(e)_$tmp"
end
end
Затем,
julia> df = DataFrame(A=uniquify(["a","a","b"]))
3×1 DataFrame
Row │ A
│ String
─────┼────────
1 │ a_1
2 │ a_2
3 │ b_1
Обновлено: после небольшого сжатия и использования string, как это сделал Богумил в другом ответе, это 1-строчная версия uniquify (работает так же, как и раньше):
uniquify(v; d = Dict{eltype(v),Int}()) =
[string(e,'_',(d[e] = get(d,e,0)+1;)) for e in v]
@август 0 — это значение по умолчанию, которое возвращает get, если не находит e. Это важно, так как вы хотите начать считать с 0, а затем добавить 1.
Спасибо! Можете ли вы объяснить мне, что здесь делает
get(d, e, 0)? Кажется, я понимаю, что он каждый раз увеличивает значение на 1, но для чего именно нужен 0?