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 链接这些操作。
我已经在以下位置查看了文档:
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 链接这些操作。