Я пытаюсь использовать DataFrames.combine
для цепочки нескольких преобразований. Желаемый окончательный DataFrame приведен ниже.
using DataFrames, Statistics
df = DataFrame(x = repeat([1], 4))
df_2 = combine(df,
:x => sum => :sum_x)
df_2.sqrt_sum_x .= sqrt.(df_2.sum_x)
println(df_2)
#1×2 DataFrame
# Row │ sum_x sqrt_sum_x
# │ Int64 Float64
#─────┼───────────────────
# 1 │ 4 2.0
Мне было интересно, есть ли способ достичь предыдущего результата с помощью одного вызова combine
. Например. используя новый target_cols
:sum_x
в качестве столбца в аргументе (см. код ниже). Однако это, кажется, выдает ArgumentError
, так как не может найти недавно вычисленный столбец :sum_x
.
combine(df,
:x => sum => :sum_x,
:sum_x => sqrt => :sqrt_sum_x)
# ERROR: ArgumentError: column name :sum_x not found in the data frame
В настоящее время это не разрешено. Причина в том, что порядок выполнения преобразований в combine
не определен. В частности, в некоторых ситуациях эти операции выполняются параллельно с использованием многопоточности (для повышения производительности).
Кроме того, такая операция потенциально может быть проблематичной при интерпретации, например, если вы написали бы:
combine(df,
:x => sum => :sum_x,
[:x, :sum_x] => (+) => :x_plus_sum_x)
затем в преобразовании:
[:x, :sum_x] => + => :x_plus_sum_x
:x
будет поступать из исходного фрейма данных df
(и иметь 4 элемента), а :sum_x
будет поступать из «еще не существующего» целевого фрейма данных (и иметь 1 элемент). Технически это можно было бы заставить работать, но мы посчитали, что это может сбивать с толку.