julia dataframe-如何按组获取下一行中的值
在Julia DataFrame中,如何进行分组并使用下一行的值 例如:julia dataframe-如何按组获取下一行中的值,dataframe,julia,Dataframe,Julia,在Julia DataFrame中,如何进行分组并使用下一行的值 例如: using DataFrames, DataFramesMeta df = DataFrame(grp=["one", "one", "two", "two", "three"], val=[1, 2, 3, 4, 5]) # Row │ grp val # │ String Int64 #────
using DataFrames, DataFramesMeta
df = DataFrame(grp=["one", "one", "two", "two", "three"], val=[1, 2, 3, 4, 5])
# Row │ grp val
# │ String Int64
#─────┼───────────────
# 1 │ one 1
# 2 │ one 2
# 3 │ two 3
# 4 │ two 4
# 5 │ three 5
@combine(groupby(df, :grp),
count = length(:val),
first_val = first(:val),
#next_val = next(:val)
)
#3×3 DataFrame
# Row │ grp count first_val
# │ String Int64 Int64
#─────┼──────────────────────────
# 1 │ one 2 1
# 2 │ two 2 3
# 3 │ three 1 5
# I would like to obtain:
# Row │ grp count first_val next_val
# │ String Int64 Int64
#─────┼──────────────────────────
# 1 │ one 2 1 2
# 2 │ two 2 3 4
# 3 │ three 1 5 NA
对于Julia DataFrames.jl,它将是例如:
julia> combine(groupby(df, :grp),
nrow => :count,
:val => first => :first_val,
:val => (x -> length(x) > 1 ? x[2] : missing) => :next_val)
3×4 DataFrame
Row │ grp count first_val next_val
│ String Int64 Int64 Int64?
─────┼────────────────────────────────────
1 │ one 2 1 2
2 │ two 2 3 4
3 │ three 1 5 missing
如果您接受其他软件包,那么使用ShiftedArrays.jl将是:
julia> using ShiftedArrays
julia> combine(groupby(df, :grp),
nrow => :count,
:val => first => :first_val,
:val => first∘lead => :next_val)
3×4 DataFrame
Row │ grp count first_val next_val
│ String Int64 Int64 Int64?
─────┼────────────────────────────────────
1 │ one 2 1 2
2 │ two 2 3 4
3 │ three 1 5 missing
以下是相同的,但具有自动生成的列名:
julia> combine(groupby(df, :grp), nrow, :val => first, :val => first∘lead)
3×4 DataFrame
Row │ grp nrow val_first val_first_lead
│ String Int64 Int64 Int64?
─────┼──────────────────────────────────────────
1 │ one 2 1 2
2 │ two 2 3 4
3 │ three 1 5 missing