【问题标题】:Julia. Summarise one column into a new DataFrame with multiple columns朱莉娅。将一列汇总为具有多列的新 DataFrame
【发布时间】:2021-06-07 16:33:52
【问题描述】:

我需要按一个变量对数据框进行分组,然后通过添加相对于另一个变量的 0.25、0.5、0.75 分位数的行数(我已经可以这样做)和列数来对其进行汇总。

在 R 中我会做例如:

    iris %>%
       group_by(Species) %>%
       summarise(
          quantile(Sepal.Length, c(.25, .75)) %>%
             matrix(nrow = 1) %>%
             as.data.frame() %>%
             setNames(paste0("Sepal.Length", c(.25, .75)))
    )

使用 DataFrames 和 DataFrameMeta 在 Julia 中编写此代码的简洁方法是什么?如果有解决方案可以一次将其应用于多个列,那就更好了。

我在 Julia 中能找到的最接近的解决方案是:

groupby(iris, :Species) |>
   x -> combine(x, :Sepal.Length => x -> [[map(p -> quantile(x, p), (Q25 = 0.25, Q75 = 0.75))] |> DataFrame])

但它只是将数据框封装到一个单元格中,而应该将其分散到多个列中。

【问题讨论】:

    标签: dataframe julia data-wrangling


    【解决方案1】:

    这是我目前可以建议您的最短时间:

    combine(groupby(iris, :Species), :SepalLength => (x -> (quantile(x, [0.25, 0.75]))') => [:q25, :q75])
    

    或类似

    combine(groupby(iris, :Species), :SepalLength => (x -> [quantile(x, [0.25, 0.75])]) => [:25, :q75])
    

    combine(groupby(iris, :Species), :SepalLength .=> [x -> quantile(x, q) for q in [0.25, 0.75]] .=> [:q25, :q75])
    

    但即使您最初的解决方案似乎也比 R 短一些。我也将其重写为:

    combine(groupby(iris, :Species), :SepalLength => (x -> map(p -> quantile(x, p), (Q25=0.25, Q75=0.75))) => AsTable)
    

    这看起来有点干净。

    现在,如果您想处理多个列,您可以这样做(顺便说一句 - 您将如何在 R 中执行此操作?):

    combine(groupby(iris, :Species), [n => (x -> (quantile(x, [0.25, 0.75]))') => [n*"_q25", n*"_q75"] 
                                      for n in ["SepalLength",  "SepalWidth", "PetalLength", "PetalWidth"]])
    

    【讨论】:

    • 您好!出于某种原因,只有解决方案 3 对我有用!让df = DataFrame(a = sample(1:2, 200), b = randn(200), c = randn(200)),这样df 代替鸢尾花,a 代替物种,bc 作为其他变量我得到这些错误,按照你做的例子的顺序:
    • 1. ArgumentError: Unrecognized column selector: :b => (var"#5#6"() => [:q25, :q75]) 2. ArgumentError: Unrecognized column selector: :b => (var"#9#10" () => [:q25, :q75]) 3. 好的 4. ArgumentError: Unrecognized column selector: :b => (var"#15#17"() => AsTable) 5. ArgumentError: Unrecognized column selector: " b" => (var"#24#26"() => ["b_q25", "b_q75"])
    • 您使用的是当前的 DataFrames.jl 1.1 版本吗?看来您使用的是旧版本。
    • 您安装了一些限制 DataFrames.jl 版本的软件包。请参阅bkamins.github.io/julialang/2020/05/11/… 了解如何找出导致该问题的包的原因。当您发现问题时请告诉我,以便我可以让包维护者知道该包需要更新的事实。话虽如此,在 Julia 中,通常的做法是为每个项目使用单独的环境,请参阅pkgdocs.julialang.org/dev/getting-started/…。这应该可以解决您的问题。
    • 您需要安装]add JuliaDB#main,因为允许最新版本 PooledArrays.jl 的 JuliaDB.jl 版本尚未发布。同样在一般情况下-如上所述。最好不要将 JuliaDB 保存在全局包环境中,而仅将其保存在您需要它的项目特定环境中(这样您就不必使用 #main 进行解决方案)。
    猜你喜欢
    • 2018-11-27
    • 2014-04-26
    • 1970-01-01
    • 2014-12-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-02-04
    • 2017-01-15
    相关资源
    最近更新 更多