2015-02-06 29 views
7

Dưới đây là một khung dữ liệu chứa một cột id người dùng:Tại sao hàm digest trả về cùng một giá trị mỗi khi được sử dụng với đột biến của dplyr?

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

Vì lợi ích của lập luận, tôi muốn tạo một cột mới có chứa căn bậc hai của các user id, và một cột mới có chứa một hash của id người dùng. Vì vậy, tôi làm điều này:

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

... trong đó digest() đến từ gói phân hủy.

Trong khi căn bậc hai có vẻ hoạt động, hàm digest trả về cùng một giá trị cho mỗi id người dùng.

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

Điều này thật lạ với tôi. Không có dplyr, hàm digest() trả về các giá trị khác nhau cho các đầu vào khác nhau. Tôi không hiểu gì về dplyr?

Cảm ơn

Trả lời

16

Chức năng digest() không được vectơ hóa. Vì vậy, nếu bạn vượt qua trong một vectơ, bạn nhận được một giá trị cho toàn bộ véc tơ chứ không phải là một thông báo cho mỗi phần tử của vectơ. Vì nó trả về một giá trị, giá trị đó được tái chế cho mỗi hàng của data.frame của bạn. Bạn có thể tạo ra phiên bản vectorized của riêng bạn

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 

mà phù hợp với những gì bạn nhận được khi bạn vượt qua trong mỗi phần tử vector riêng

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

tuyệt vời, cảm ơn bạn rất nhiều. Tôi đến từ python/gấu trúc và vì vậy tôi bằng cách nào đó giả định rằng mutate() làm việc giống như phương thức .apply() của gấu trúc, trong đó hàm được truyền sẽ hoạt động trên từng phần tử riêng lẻ. – csaid

+0

Câu trả lời hay. Tôi vừa thêm ý tưởng 'vdigest <- Vectorize (digest)' vào trang trợ giúp cho 'digest'. –

Các vấn đề liên quan