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

tuc*_*son 5 dataframe julia

我已经检查了文档:

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
Run Code Online (Sandbox Code Playgroud)

按组获取行数:

df[, .N, by=grp]
   grp N
1:   1 3
2:   2 3
Run Code Online (Sandbox Code Playgroud)

添加一个按组索引的列:

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
Run Code Online (Sandbox Code Playgroud)

添加一列作为每个组的索引。当然这里我们已经有 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
Run Code Online (Sandbox Code Playgroud)

Bog*_*ski 4

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

\n
julia> using DataFrames\n\njulia> df = DataFrame(grp = repeat(1:2, 3), x = 6:-1:1, y = 4:9,\n                         z = [3:7; missing], id = 'a':'f')\n6\xc3\x975 DataFrame\n Row \xe2\x94\x82 grp    x      y      z        id\n     \xe2\x94\x82 Int64  Int64  Int64  Int64?   Char\n\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\xbc\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\n   1 \xe2\x94\x82     1      6      4        3  a\n   2 \xe2\x94\x82     2      5      5        4  b\n   3 \xe2\x94\x82     1      4      6        5  c\n   4 \xe2\x94\x82     2      3      7        6  d\n   5 \xe2\x94\x82     1      2      8        7  e\n   6 \xe2\x94\x82     2      1      9  missing  f\n\njulia> gdf = groupby(df, :grp)\nGroupedDataFrame with 2 groups based on key: grp\nFirst Group (3 rows): grp = 1\n Row \xe2\x94\x82 grp    x      y      z       id\n     \xe2\x94\x82 Int64  Int64  Int64  Int64?  Char\n\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\xbc\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\n   1 \xe2\x94\x82     1      6      4       3  a\n   2 \xe2\x94\x82     1      4      6       5  c\n   3 \xe2\x94\x82     1      2      8       7  e\n\xe2\x8b\xae\nLast Group (3 rows): grp = 2\n Row \xe2\x94\x82 grp    x      y      z        id\n     \xe2\x94\x82 Int64  Int64  Int64  Int64?   Char\n\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\xbc\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\n   1 \xe2\x94\x82     2      5      5        4  b\n   2 \xe2\x94\x82     2      3      7        6  d\n   3 \xe2\x94\x82     2      1      9  missing  f\n\njulia> combine(gdf, nrow)\n2\xc3\x972 DataFrame\n Row \xe2\x94\x82 grp    nrow\n     \xe2\x94\x82 Int64  Int64\n\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\xbc\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\n   1 \xe2\x94\x82     1      3\n   2 \xe2\x94\x82     2      3\n\njulia> transform!(gdf, :grp => eachindex => :idx)\n6\xc3\x976 DataFrame\n Row \xe2\x94\x82 grp    x      y      z        id    idx\n     \xe2\x94\x82 Int64  Int64  Int64  Int64?   Char  Int64\n\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\xbc\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\n   1 \xe2\x94\x82     1      6      4        3  a         1\n   2 \xe2\x94\x82     2      5      5        4  b         1\n   3 \xe2\x94\x82     1      4      6        5  c         2\n   4 \xe2\x94\x82     2      3      7        6  d         2\n   5 \xe2\x94\x82     1      2      8        7  e         3\n   6 \xe2\x94\x82     2      1      9  missing  f         3\n\njulia> df.grp_index = groupindices(gdf)\n6-element Vector{Union{Missing, Int64}}:\n 1\n 2\n 1\n 2\n 1\n 2\n\njulia> df\n6\xc3\x977 DataFrame\n Row \xe2\x94\x82 grp    x      y      z        id    idx    grp_index\n     \xe2\x94\x82 Int64  Int64  Int64  Int64?   Char  Int64  Int64?\n\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\xbc\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\n   1 \xe2\x94\x82     1      6      4        3  a         1          1\n   2 \xe2\x94\x82     2      5      5        4  b         1          2\n   3 \xe2\x94\x82     1      4      6        5  c         2          1\n   4 \xe2\x94\x82     2      3      7        6  d         2          2\n   5 \xe2\x94\x82     1      2      8        7  e         3          1\n   6 \xe2\x94\x82     2      1      9  missing  f         3          2\n
Run Code Online (Sandbox Code Playgroud)\n

正如 @phipsgabler 所评论的,如果您想要使用非标准评估语法,您还可以使用 DataFramesMeta.jl 或 DataFrameMacros.jl 包(上面我使用的代码不依赖于非标准评估,而只使用标准 Julia 语法)。

\n

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

\n