Длинный и извилистый путь, изучение DataFrames.jl и еще один вопрос.
Я пытаюсь принудительно вызвать функцию, возвращающую скаляр, чтобы отобразить обратно на весь вектор. Я не уверен, что это совершенно ясно, поэтому позвольте мне привести пример:
Допустим, я запускаю следующий (и теперь канонический) пример
df = DataFrame(grp = rand(["a","b"], 100), x= rand(100), y = rand(100), z=rand(100));
by(df, :grp,result= (:x) => (x) -> sum(x))
2×2 DataFrame
│ Row │ grp │ result │
│ │ String │ Float64 │
├─────┼────────┼─────────┤
│ 1 │ b │ 30.431 │
│ 2 │ a │ 19.9667 │
Я получаю сумму х для каждой группы. Все хорошо. Но по какой-то причине я хочу, чтобы эта сумма каждой группы была приведена для каждой строки в наборе данных
. Я нашел следующий хак
by(df, :grp,result= (:x) => (x) -> x.-x.+sum(x))
, который дает именно то, что я ожидаю
│ Row │ grp │ result │
│ │ String │ Float64 │
├─────┼────────┼─────────┤
│ 1 │ b │ 30.431 │
│ 2 │ b │ 30.431 │
│ 3 │ b │ 30.431 │
⋮
│ 98 │ a │ 19.9667 │
│ 99 │ a │ 19.9667 │
│ 100 │ a │ 19.9667 │
Теперь я, по сути, заставляю векторный аспект в функции реализовывать это (я также делаю это самым не элегантным способом).
Мой вопрос: есть ли с помощью () правильный / более хороший способ заставить функцию, возвращающую скаляр, отобразить исходный вектор?
В моем мнение, это было бы очень полезно, а также поможет решить следующие ситуации.
by(df, :grp,result= (:x) => (x) -> sum(x),result2= (:x) => (x) -> mean(x)) # works returns 2 lines
by(df, :grp,result= (:x) => (x) -> sum(x),result2= (:x) => (x) -> x.-5) # doesnt work (scalar vs vector)
by(df, :grp,result= (:x) => (x) -> x.-x.+sum(x),result2= (:x) => (x) -> x.-5) # works returns 100 lines
Я уверен, что мне чего-то не хватает, любая помощь будет отличной.