假设我有以下数据框:
\njulia> 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
。我尝试了以下方法:
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
?
这是一个常见问题。问题是 Julia 如何解释你的转换规范:
\njulia> :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 运算符优先级规则,整个部分被视为匿名函数的定义。相反,您应该将匿名函数的定义括在括号中,如下所示:
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
如下所示:
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