2

groupby我使用以下函数对 DataFrame 的子集进行了计算:

using RDatasets
iris = dataset("datasets", "iris")
describe(iris)
iris_grouped = groupby(iris,:Species)
iris_avg = map(:SepalLength => mean,iris_grouped::GroupedDataFrame)

现在我想绘制结果,但我收到以下绘图的错误消息:

@df iris_avg bar(:Species,:SepalLength)

仅支持表

绘制数据的最佳方法是什么?我的想法是创建一个 DataFrame 并从那里开始。我将如何做到这一点,即如何将 GroupedDataFrame 转换为单个 DataFrame?谢谢!

4

2 回答 2

6

转换GroupedDataFrame为对它的DataFrame公正调用DataFrame,例如:

julia> DataFrame(iris_avg)
3×2 DataFrame
│ Row │ Species      │ SepalLength_mean │
│     │ Categorical… │ Float64          │
├─────┼──────────────┼──────────────────┤
│ 1   │ setosa       │ 5.006            │
│ 2   │ versicolor   │ 5.936            │
│ 3   │ virginica    │ 6.588            │

在你的情况下。

你也可以写:

julia> combine(:SepalLength => mean, iris_grouped)
3×2 DataFrame
│ Row │ Species      │ SepalLength_mean │
│     │ Categorical… │ Float64          │
├─────┼──────────────┼──────────────────┤
│ 1   │ setosa       │ 5.006            │
│ 2   │ versicolor   │ 5.936            │
│ 3   │ virginica    │ 6.588            │

在原件GroupedDataFrame

julia> by(:SepalLength => mean, iris, :Species)
3×2 DataFrame
│ Row │ Species      │ SepalLength_mean │
│     │ Categorical… │ Float64          │
├─────┼──────────────┼──────────────────┤
│ 1   │ setosa       │ 5.006            │
│ 2   │ versicolor   │ 5.936            │
│ 3   │ virginica    │ 6.588            │

在原件上DataFrame

我在这里将转换写为第一个参数,但通常,您会将其写为最后一个参数(这样您就可以传递多个转换),例如:

julia> by(iris, :Species, :SepalLength => mean, :SepalWidth => minimum)
3×3 DataFrame
│ Row │ Species      │ SepalLength_mean │ SepalWidth_minimum │
│     │ Categorical… │ Float64          │ Float64            │
├─────┼──────────────┼──────────────────┼────────────────────┤
│ 1   │ setosa       │ 5.006            │ 2.3                │
│ 2   │ versicolor   │ 5.936            │ 2.0                │
│ 3   │ virginica    │ 6.588            │ 2.2                │
于 2019-09-23T16:19:14.380 回答
3

我认为您最好使用该by功能iris_avg直接访问您的。by遍历 a DataFrame,然后将给定函数应用于结果。通常,它与do块一起使用。

julia> by(iris, :Species) do df
           DataFrame(sepal_mean = mean(df.SepalLength))
       end
3×2 DataFrame
│ Row │ Species      │ sepal_mean │
│     │ Categorical… │ Float64    │
├─────┼──────────────┼────────────┤
│ 1   │ setosa       │ 5.006      │
│ 2   │ versicolor   │ 5.936      │
│ 3   │ virginica    │ 6.588      │

或者等价地,

julia> by(iris, :Species, SepalLength_mean = :SepalLength => mean)
3×2 DataFrame
│ Row │ Species      │ SepalLength_mean │
│     │ Categorical… │ Float64          │
├─────┼──────────────┼──────────────────┤
│ 1   │ setosa       │ 5.006            │
│ 2   │ versicolor   │ 5.936            │
│ 3   │ virginica    │ 6.588            │

有关更多详细信息/示例,请参见此处

或者,您可以像以前那样分几个步骤进行操作,然后使用DataFrame构造函数转换为正确的DataFrame

julia> iris_grouped = groupby(iris,:Species);

julia> iris_avg = map(:SepalLength => mean,iris_grouped::GroupedDataFrame);

julia> DataFrame(iris_avg)
3×2 DataFrame
│ Row │ Species      │ SepalLength_mean │
│     │ Categorical… │ Float64          │
├─────┼──────────────┼──────────────────┤
│ 1   │ setosa       │ 5.006            │
│ 2   │ versicolor   │ 5.936            │
│ 3   │ virginica    │ 6.588            │
于 2019-09-23T16:22:16.340 回答