我有一个数据框,其中包含一列作为唯一标识符,我想创建一个新列作为哈希值。 我正在使用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
有人可以向我解释我的语法有什么问题吗?
答案 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)