无法在 DataFrames.jl 中执行列转换

Bog*_*ski 5 dataframe julia

假设我有以下数据框:

\n
julia> using DataFrames\n\njulia> df = DataFrame(id=["a", "b", "a", "b", "b"], v=[1, 1, 1, 1, 2])\n5\xc3\x972 DataFrame\n Row \xe2\x94\x82 id      v\n     \xe2\x94\x82 String  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\n   1 \xe2\x94\x82 a           1\n   2 \xe2\x94\x82 b           1\n   3 \xe2\x94\x82 a           1\n   4 \xe2\x94\x82 b           1\n   5 \xe2\x94\x82 b           2\n
Run Code Online (Sandbox Code Playgroud)\n

:v我想计算由 column 定义的每个组中的唯一值的数量:id。我尝试了以下方法:

\n
julia> gdf = groupby(df, :id)\nGroupedDataFrame with 2 groups based on key: id\nFirst Group (2 rows): id = "a"\n Row \xe2\x94\x82 id      v\n     \xe2\x94\x82 String  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\n   1 \xe2\x94\x82 a           1\n   2 \xe2\x94\x82 a           1\n\xe2\x8b\xae\nLast Group (3 rows): id = "b"\n Row \xe2\x94\x82 id      v\n     \xe2\x94\x82 String  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\n   1 \xe2\x94\x82 b           1\n   2 \xe2\x94\x82 b           1\n   3 \xe2\x94\x82 b           2\n\njulia> combine(gdf, :v => x -> length(unique(x)) => :len)\n2\xc3\x972 DataFrame\n Row \xe2\x94\x82 id      v_function\n     \xe2\x94\x82 String  Pair\xe2\x80\xa6\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\n   1 \xe2\x94\x82 a       1=>:len\n   2 \xe2\x94\x82 b       2=>:len\n
Run Code Online (Sandbox Code Playgroud)\n

但它不会产生预期的结果。如何修复呼叫combine

\n

Bog*_*ski 5

这是一个常见问题。问题是 Julia 如何解释你的转换规范:

\n
julia> :v => x -> length(unique(x)) => :len\n:v => var"#3#4"()\n
Run Code Online (Sandbox Code Playgroud)\n

正如您所看到的x -> length(unique(x)) => :len,由于 Julia 运算符优先级规则,整个部分被视为匿名函数的定义。相反,您应该将匿名函数的定义括在括号中,如下所示:

\n
julia> combine(gdf, :v => (x -> length(unique(x))) => :len)\n2\xc3\x972 DataFrame\n Row \xe2\x94\x82 id      len\n     \xe2\x94\x82 String  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\n   1 \xe2\x94\x82 a           1\n   2 \xe2\x94\x82 b           2\n
Run Code Online (Sandbox Code Playgroud)\n

另请注意,在这种情况下,您可以使用函数组合运算符,\xe2\x88\x98如下所示:

\n
julia> combine(gdf, :v => length\xe2\x88\x98unique => :len)\n2\xc3\x972 DataFrame\n Row \xe2\x94\x82 id      len\n     \xe2\x94\x82 String  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\n   1 \xe2\x94\x82 a           1\n   2 \xe2\x94\x82 b           2\n
Run Code Online (Sandbox Code Playgroud)\n

在这种情况下,您不必显式定义匿名函数,因此不需要括号。

\n