Dataframe 按组统计唯一值的数量

Dataframe 按组统计唯一值的数量,dataframe,julia,Dataframe,Julia,我知道使用组合(groupby(df,:A),nrow=>:count)来计算不同:A的行数。但是,对于不同的:A,要获得:B的唯一值的数量,正确的实现应该是什么?基本上,我正在寻找R的对应项:df%>%groupby(A)%>%summary(n_unique=n_distinct(B))。谢谢 我想你应该能做到 combine(groupby(df, :A), :B => length ∘ unique => :n_distint_B) 像这样: julia> using

我知道使用
组合(groupby(df,:A),nrow=>:count)
来计算不同
:A的行数。但是,对于不同的
:A
,要获得
:B
的唯一值的数量,正确的实现应该是什么?基本上,我正在寻找R的对应项:
df%>%groupby(A)%>%summary(n_unique=n_distinct(B))
。谢谢

我想你应该能做到

combine(groupby(df, :A), :B => length ∘ unique => :n_distint_B)
像这样:

julia> using DataFrames

julia> df = DataFrame(a = rand(["a", "b"], 20), b = rand(1:5, 20))
20×2 DataFrame
 Row │ a       b     
     │ String  Int64 
─────┼───────────────
   1 │ a           3
   2 │ b           4
   3 │ a           1
   4 │ a           1
   5 │ b           1
   6 │ a           2
   7 │ b           4
   8 │ a           2
   9 │ b           2
  10 │ b           1
  11 │ b           3
  12 │ b           3
  13 │ a           4
  14 │ a           4
  15 │ b           3
  16 │ b           2
  17 │ a           5
  18 │ a           5
  19 │ b           5
  20 │ a           1

julia> combine(groupby(df, :a), :b => length ∘ unique => :n_distinct_b)
2×2 DataFrame
 Row │ a       n_distinct_b 
     │ String  Int64        
─────┼──────────────────────
   1 │ a                  5
   2 │ b                  5

下面是一个使用双
groupby
-
combine
策略的替代解决方案,该策略速度稍快:

julia> df = repeat(DataFrame(a = rand(["a", "b"], 20), b = rand(1:5, 20)), 10^6);

julia> @btime combine(groupby($df, :a), :b => length ∘ unique => :n_distinct_b);
  650.915 ms (237 allocations: 866.37 MiB)

julia> @btime combine(groupby(combine(groupby($df, [:a, :b]), nrow), :a), nrow => :n_distinct_b);
  457.884 ms (346 allocations: 561.20 MiB)

(但尼尔斯的建议更自然)

嗨,尼尔斯,这正好解决了我的问题。非常感谢你!