2015-04-02 3 views
7

Ho un DataArray molto lungo di stringhe e mi piacerebbe generare un DataFrame in cui una colonna è tutte le stringhe univoche e la seconda è il numero di occorrenze. In questo momento sto facendo qualcosa comeUn modo migliore per contare il numero di occorrenze di oggetti unici?

using DataFrames 
df = DataFrame() 
df[:B]=[ "a", "c", "c", "D", "E"] 
uniqueB = unique(df[:B]) 
println(uniqueB) 
howMany=zeros(size(uniqueB)) 
for i=1:size(uniqueB,1) 
    howMany[i] = count(j->(j==uniqueB[i]), df[:B]) 
end 
answer = DataFrame() 
answer[:Letters] = uniqueB 
answer[:howMany] = howMany 
answer 

ma sembra che ci dovrebbe essere un modo molto più semplice per fare questo, possibilmente con una singola linea. (So ​​che potrei renderlo un po 'più veloce con un po' più codice cercando il risultato in ogni iterazione piuttosto che nella sorgente.) Una domanda probabilmente correlata è here ma non sembra che hist sia sovraccaricato per i bin non numerici. qualche idea?

risposta

7

Se si desidera una full frame, è possibile raggruppare da B e chiamare nrow su ciascun gruppo:

julia> by(df, :B, nrow) 
4x2 DataFrames.DataFrame 
| Row | B | x1 | 
|-----|-----|----| 
| 1 | "D" | 1 | 
| 2 | "E" | 1 | 
| 3 | "a" | 1 | 
| 4 | "c" | 2 | 

Anche al di fuori del contesto dataframe, però, si può sempre usare DataStructures.counter piuttosto che reimplementare da soli:

julia> using DataStructures 

julia> counter(df[:B]) 
DataStructures.Accumulator{ASCIIString,Int32}(Dict("D"=>1,"a"=>1,"c"=>2,"E"=>1))