2015-02-06 15 views
7

Ecco un frame di dati che contiene una colonna di ID utente:Perché la funzione digest restituisce lo stesso valore ogni volta che viene utilizzata con il mutante di dplyr?

> head(df) 
     uid 
1 14070210 
2 14080815 
3 14091420 

Per amor di discussione, voglio creare una nuova colonna che contiene la radice quadrata della id utente, e un altro nuova colonna che contiene un hash di l'id utente. Così faccio questo:

df_mutated <- df %>% 
       mutate(sqrt_uid = sqrt(uid), hashed_uid = digest(uid)) 

... dove digest() proviene dal pacchetto digest.

Mentre la radice quadrata sembra funzionare, la funzione digest restituisce lo stesso valore per ciascun id utente.

> head(df_mutated) 
     uid sqrt_uid      hashed_uid 
1 14070210 3751.028 f8c4b39403e57d85cd1698d2353954d0 
2 14080815 3752.441 f8c4b39403e57d85cd1698d2353954d0 
3 14091420 3753.854 f8c4b39403e57d85cd1698d2353954d0 

Questo è strano per me. Senza dplyr, la funzione digest() restituisce valori diversi per input diversi. Cosa non sto capendo di dplyr?

Grazie

risposta

16

La funzione digest() non è vettorizzate. Quindi se passi in un vettore, ottieni un valore per l'intero vettore piuttosto che un riassunto per ogni elemento del vettore. Poiché restituisce un valore, tale valore viene riciclato per ogni riga di data.frame. È possibile creare la propria versione di vettorializzare

vdigest <- Vectorize(digest) 
df %>% mutate(sqrt_uid = sqrt(uid), hashed_uid = vdigest(uid)) 
#  uid sqrt_uid      hashed_uid 
# 1 14070210 3751.028 cc90019421220a24f75b5ed5daec36ff 
# 2 14080815 3752.441 9f7f643940b692dd9c7effad439547e8 
# 3 14091420 3753.854 89e6666fdfdbfb532b2d7940def9d47d 

che corrisponde a quello che si ottiene quando si passa a ciascun elemento del vettore singolarmente

digest(df$uid[1]) 
# [1] "cc90019421220a24f75b5ed5daec36ff" 
digest(df$uid[3]) 
# [1] "89e6666fdfdbfb532b2d7940def9d47d" 
+0

Meraviglioso, grazie mille. Vengo da Python/Panda e quindi ho in qualche modo pensato che mutate() funzionasse come il metodo di panda .apply(), dove la funzione passata avrebbe agito su ciascun elemento individualmente. – csaid

+0

Bella risposta. Ho appena aggiunto l'idea di 'vdigest <- Vectorize (digest)' alla pagina di aiuto per 'digest'. –

Problemi correlati