2015-02-06 64 views
7

下面是一個包含用戶ID的列中的數據幀:爲什麼每次使用dplyr的mutate時,digest函數都會返回相同的值?

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

對於參數的緣故,我要創建包含用戶ID的平方根一個新的列,以及包含的散列另一個新列用戶標識。所以我這樣做:

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

...其中digest()來自摘要包。

儘管平方根似乎有效,但摘要函數爲每個用戶ID返回相同的值。

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

這對我來說很奇怪。沒有dplyr,digest()函數爲不同的輸入返回不同的值。我不瞭解dplyr?

感謝

回答

16

digest()功能沒有量化。所以如果你傳入一個向量,你會得到整個向量的一個值,而不是每個向量元素的摘要。由於它返回一個值,因此該值將循環用於data.frame的每一行。你可以創建自己的矢量版本

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 

它匹配你得到什麼,當你在每個矢量元素單獨

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

妙傳,太感謝你了。我來自python/pandas,所以我以某種方式假定mutate()像panda的.apply()方法一樣工作,其中傳遞的函數將單獨作用於每個元素。 – csaid 2015-02-06 16:12:13

+0

很好的答案。我只是將'vdigest < - Vectorize(摘要)'的想法添加到'digest'的幫助頁面。 – 2017-02-20 13:20:43

相關問題