为什么每次与dplyr的mutate一起使用时,摘要函数会返回相同的值?

csa*_*aid 8 r dplyr

这是一个包含用户ID列的数据框:

> head(df)
       uid
1 14070210
2 14080815
3 14091420
Run Code Online (Sandbox Code Playgroud)

为了参数,我想创建一个包含用户id的平方根的新列,以及另一个包含用户id哈希的新列.所以我这样做:

df_mutated <- df %>%
              mutate(sqrt_uid = sqrt(uid), hashed_uid = digest(uid))
Run Code Online (Sandbox Code Playgroud)

... 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
Run Code Online (Sandbox Code Playgroud)

这对我来说很奇怪.如果没有dplyr,digest()函数会为不同的输入返回不同的值.我怎么不了解dplyr?

谢谢

MrF*_*ick 17

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
Run Code Online (Sandbox Code Playgroud)

它与您单独传递每个向量元素时获得的内容相匹配

digest(df$uid[1])
# [1] "cc90019421220a24f75b5ed5daec36ff"
digest(df$uid[3])
# [1] "89e6666fdfdbfb532b2d7940def9d47d"
Run Code Online (Sandbox Code Playgroud)