Julia DataFrame - 如何获取 data.table .N, .GRP

Julia DataFrame - how to get data.table .N, .GRP

我已经在以下位置查看了文档:

https://dataframes.juliadata.org/stable/man/comparisons/#Comparison-with-the-R-package-data.table

但我缺少以下我经常与 data.table 一起使用的命令,我很难找到解决这些问题的方法。

我正在重复使用相同的示例:

library(data.table)
df  <- data.table(grp = rep(1:2, 3), x = 6:1, y = 4:9,
                  z = c(3:7, NA), id = letters[1:6])
df
   grp x y  z id
1:   1 6 4  3  a
2:   2 5 5  4  b
3:   1 4 6  5  c
4:   2 3 7  6  d
5:   1 2 8  7  e
6:   2 1 9 NA  f

按组获取行数:

df[, .N, by=grp]
   grp N
1:   1 3
2:   2 3

添加一个按组索引的列:

df[, idx := 1:.N, by=grp]
> df
   grp x y  z id idx
1:   1 6 4  3  a   1
2:   2 5 5  4  b   1
3:   1 4 6  5  c   2
4:   2 3 7  6  d   2
5:   1 2 8  7  e   3
6:   2 1 9 NA  f   3

添加一列作为每个组的索引。 当然这里我们已经有了 grp 作为数值索引,但通常情况并非如此。

df[, grp_index := .GRP, by=grp]
df
   grp x y  z id idx grp_index
1:   1 6 4  3  a   1         1
2:   2 5 5  4  b   1         2
3:   1 4 6  5  c   2         1
4:   2 3 7  6  d   2         2
5:   1 2 8  7  e   3         1
6:   2 1 9 NA  f   3         2

有几种方法可以做到这一点。这是一个例子:

julia> using DataFrames

julia> df = DataFrame(grp = repeat(1:2, 3), x = 6:-1:1, y = 4:9,
                         z = [3:7; missing], id = 'a':'f')
6×5 DataFrame
 Row │ grp    x      y      z        id
     │ Int64  Int64  Int64  Int64?   Char
─────┼────────────────────────────────────
   1 │     1      6      4        3  a
   2 │     2      5      5        4  b
   3 │     1      4      6        5  c
   4 │     2      3      7        6  d
   5 │     1      2      8        7  e
   6 │     2      1      9  missing  f

julia> gdf = groupby(df, :grp)
GroupedDataFrame with 2 groups based on key: grp
First Group (3 rows): grp = 1
 Row │ grp    x      y      z       id
     │ Int64  Int64  Int64  Int64?  Char
─────┼───────────────────────────────────
   1 │     1      6      4       3  a
   2 │     1      4      6       5  c
   3 │     1      2      8       7  e
⋮
Last Group (3 rows): grp = 2
 Row │ grp    x      y      z        id
     │ Int64  Int64  Int64  Int64?   Char
─────┼────────────────────────────────────
   1 │     2      5      5        4  b
   2 │     2      3      7        6  d
   3 │     2      1      9  missing  f

julia> combine(gdf, nrow)
2×2 DataFrame
 Row │ grp    nrow
     │ Int64  Int64
─────┼──────────────
   1 │     1      3
   2 │     2      3

julia> transform!(gdf, :grp => eachindex => :idx)
6×6 DataFrame
 Row │ grp    x      y      z        id    idx
     │ Int64  Int64  Int64  Int64?   Char  Int64
─────┼───────────────────────────────────────────
   1 │     1      6      4        3  a         1
   2 │     2      5      5        4  b         1
   3 │     1      4      6        5  c         2
   4 │     2      3      7        6  d         2
   5 │     1      2      8        7  e         3
   6 │     2      1      9  missing  f         3

julia> df.grp_index = groupindices(gdf)
6-element Vector{Union{Missing, Int64}}:
 1
 2
 1
 2
 1
 2

julia> df
6×7 DataFrame
 Row │ grp    x      y      z        id    idx    grp_index
     │ Int64  Int64  Int64  Int64?   Char  Int64  Int64?
─────┼──────────────────────────────────────────────────────
   1 │     1      6      4        3  a         1          1
   2 │     2      5      5        4  b         1          2
   3 │     1      4      6        5  c         2          1
   4 │     2      3      7        6  d         2          2
   5 │     1      2      8        7  e         3          1
   6 │     2      1      9  missing  f         3          2

正如@phipsgabler 评论的那样,如果你想使用非标准评估语法,你也可以使用 DataFramesMeta.jl 或 DataFrameMacros.jl 包(上面我使用的代码不依赖于非标准评估但是只使用标准的 Julia 语法。

如果愿意,您也可以使用 Chain.jl 链接这些操作。