R哈希列不使用摘要工作

时间:2018-07-27 22:30:58

标签: r dplyr

我有一个数据框,其中包含一列作为唯一标识符,我想创建一个新列作为哈希值。 我正在使用dplyr和摘要的转换进行哈希处理,但看起来所有哈希值都相同。

          status  identifier
1         NEW     1035656|8000|157.6|2018-12-10 00:00:00.0|2018-12-06 00:00:00.0
2         NEW     1852231|460000|1748.0|2018-03-09 00:00:00.0|2018-03-07 00:00:00.0
3         NEW     3197282|6000|55.2|2019-01-18 00:00:00.0|2019-01-16 00:00:00.0
4         NEW     1827398|396000|21859.2|2019-02-25 00:00:00.0|2019-02-21 00:00:00.0
5         NEW     1148967|60000|150.0|2018-10-15 00:00:00.0|2018-10-11 00:00:00.0

输出

data_new <- transform(data, hash=digest(identifier, algo="md5", serialize = F))

结果看起来是错误的。

hash
1 d1ede7da2094651658adfd6171c33c52
2 d1ede7da2094651658adfd6171c33c52
3 d1ede7da2094651658adfd6171c33c52
4 d1ede7da2094651658adfd6171c33c52
5 d1ede7da2094651658adfd6171c33c52
6 d1ede7da2094651658adfd6171c33c52

有人可以向我解释我的语法有什么问题吗?

2 个答案:

答案 0 :(得分:1)

由于哈希算法不在乎您给他多少输入,因此它会压缩您的整个列而不是单个值。 digest函数旨在对整个列/列表等进行哈希处理。它对所有可以获取的内容进行哈希处理。因此,为了进行验证,让我们一次输入整个列:

digest( c("1035656|8000|157.6|2018-12-10 00:00:00.0|2018-12-06 00:00:00.0", "1852231|460000|1748.0|2018-03-09 00:00:00.0|2018-03-07 00:00:00.0",
          "3197282|6000|55.2|2019-01-18 00:00:00.0|2019-01-16 00:00:00.0", "1827398|396000|21859.2|2019-02-25 00:00:00.0|2019-02-21 00:00:00.0",
          "1148967|60000|150.0|2018-10-15 00:00:00.0|2018-10-11 00:00:00.0"), algo="md5", serialize= F)

它给出了与您的示例一样的输出结果。由于只有一个返回值,因此该列将填充相同的值。

 "d1ede7da2094651658adfd6171c33c52"

解决方案非常简单,只需在列的每一行上使用哈希即可,例如:

df$hash <-lapply(df$identifier, function(x) {digest(x, algo="md5", serialize = F)})

这给出了意向者的输出:

   identifier                                                          hash
1  1035656|8000|157.6|2018-12-10 00:00:00.0|2018-12-06 00:00:00.0      d1ede7da2094651658adfd6171c33c52
2  1852231|460000|1748.0|2018-03-09 00:00:00.0|2018-03-07 00:00:00.0   ca4caeac0a702094d51a13e67f23e56a
3  3197282|6000|55.2|2019-01-18 00:00:00.0|2019-01-16 00:00:00.0       239342dba0ec56f3b4200cb36046f2e0
4  1827398|396000|21859.2|2019-02-25 00:00:00.0|2019-02-21 00:00:00.0  54ea74e4344c14f8708dc47425ee1995
5  1148967|60000|150.0|2018-10-15 00:00:00.0|2018-10-11 00:00:00.0     f6bb25b0d7c1fbb65117d9403dadc7d2

答案 1 :(得分:1)

简单地:

data_new <- transform(data, hash=sapply(identifier,  digest, algo="md5", serialize = F,USE.NAMES = F)