Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/77.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
R:将电子邮件地址转换为唯一整数_R_Char_Int_Converter - Fatal编程技术网

R:将电子邮件地址转换为唯一整数

R:将电子邮件地址转换为唯一整数,r,char,int,converter,R,Char,Int,Converter,R初学者,似乎有一个非常简单的问题: 我有许多电子邮件日志,我已将其读入R,格式如下: >log1 Date Time From To 1 2000-01-01 00:00:00 bob@mail.com test1@mail.com 2 2000-01-02 01:00:00 carolyn @mail.com test2@mail.com 3 200

R初学者,似乎有一个非常简单的问题: 我有许多电子邮件日志,我已将其读入R,格式如下:

>log1
    Date        Time            From                 To
1   2000-01-01  00:00:00    bob@mail.com            test1@mail.com
2   2000-01-02  01:00:00    carolyn @mail.com       test2@mail.com
3   2000-01-03  02:00:00    chris@mail.com          test3@mail.com
4   2000-01-04  03:00:00    chris @mail.com         test4@mail.com
5   2000-01-05  04:00:00    alan@mail.com           test5@mail.com
6   2000-01-06  05:00:00    alan.@mail.com          test6@mail.com
我需要将log1$From和log1$to更改为全局唯一的数字标识符,这样当我稍后读入其他日志时,任何给定的电子邮件地址都将收到与以前日志相同的标识符

我试过:

id <- as.numeric(as.character(log1[,3])))
id<-as.numeric(levels(log1[,3])))
id <- charToRaw(log1[,4]), base=16)

id您需要为日志中的每封电子邮件创建一个唯一的id。一种方法是计算每封电子邮件的crc校验和,并将其用作标识符,但这将是一个很长的数字。或者,您可以在R中实现一个hashmap,并将电子邮件作为hashmap的密钥。

您可以使用MD5生成全局唯一标识符,因为它的冲突概率非常低,但由于其输出为128位,您需要一些数字来表示它(32位R中有四个整数,64位R中有两个整数)。不过,使用短数值向量应该很容易处理这个问题

以下是如何为电子邮件地址(或任何其他字符串)生成四个整数的向量:

库(摘要)

电子邮件我认为这会满足您的需求,而且效率很高,您只需使用基本软件包就可以做到这一点

程序:

1.将两列转换为系数

2.以完全相同的方式合并因子级别,以便每封电子邮件在因子级别中具有唯一的ID

3.将每列中的条目更改为与其因子级别对应的数字。因此,我们可以确定test1@gmail.com只需在两列中查找“1”,即可发送和接收电子邮件

log1$From <- as.factor(log1$From) 
log1$To <- as.factor(log1$To) 
emails <- union(levels(log1$From), levels(log1$To))
levels(log1$From) <- emails
levels(log1$To) <- emails
log1$From <- as.numeric(log1$From) 
log1$To <- as.numeric(log1$To)

你应该做这个把戏!您可以编写一个过程,使其看起来更干净……

我对R不太了解,但从您提到的内容来看,您正在为发件人和收件人电子邮件地址的组合寻找唯一标识符。您可以尝试为它们的串联创建哈希。R似乎有一些散列函数,所以您可以尝试一下。感谢您的输入人员,肯定有比实现校验和或散列映射更简单的解决方案?!您可以使用任何算法(md5、sha、crc等),只要您为每个输入获得唯一的标识符。感谢您的输入-不幸的是,这个解决方案似乎对我不起作用。看看上面的输出,我(非常)可能会犯一些错误。谢谢,谢谢您的输入-不幸的是,我在这个解决方案中遇到了一个错误。不幸的是,这并不能确保在阅读不同的日志时,相同的电子邮件地址将收到与OP要求的相同的数字ID。
ID_to<-data.frame()
    ID_from<-data.frame()

    for (i in 1:nrow(log)){
    to<-as.numeric(paste('0x', substr(rep(hmac('secret',log[i,4], algo='md5'), 2), c(1, 9, 17, 25), c(8, 16, 24, 32)),sep=""))
    (ID_to<-rbind(ID_to,to))

    from<-as.numeric(paste('0x', substr(rep(hmac('secret',log[i,3], algo='md5'), 2), c(1, 9, 17, 25),c(8, 16, 24, 32)),sep=""))
    (ID_from<-rbind(ID_from,from))

    }

    ID_to[,3]<-paste(ID_to[,1],ID_to[,2], sep="")
    ID_from[,3]<-paste(ID_from[,1],ID_from[,2], sep="")

    edgelist<-data.frame(ID_from[,3],log[,3],ID_to[,3],log[,4],log[,1],log[,2])
    print(edgelist)
    ID_from...3.                 log...3.           ID_to...3.            log...4.   log...1. log...2.
    27488842661591306920      bob.shults@mail.com 18727221862165338513 ana.correa@mail.com 01/01/2000 00:00:00
    38124472891255273775   carolyn.green@mail.com  1251903296725454474      test2@mail.com 02/01/2000 01:00:00
    29070047663451376630      chris.long@mail.com 17074276751156451031      test3@mail.com 03/01/2000 02:00:00
    8261398433828474582 christi.nicolay@mail.com  1563683670909194033      test4@mail.com 04/01/2000 03:00:00
    18727221862165338513  alan.aronowitz@mail.com 26735368323826533112      test5@mail.com 05/01/2000 04:00:00
    5680838251168988404     alan.comnes@mail.com  2923605896229594830      test6@mail.com 06/01/2000 05:00:00
    2351312285811012730       dab@sprintmail.com 17171333544033270402      test7@mail.com 07/01/2000 06:00:00
    328278708432069254      ana.correa@mail.com 33840664403556851587      test8@mail.com 08/01/2000 07:00:00
    1127901879852039037   andrew.fastow@mail.com  1973548136161209824      test9@mail.com 09/01/2000 08:00:00
    7349515121496417787 elena.kapralova@mail.com  5680838251168988404     test10@mail.com 10/01/2000 09:00:00
    27488842661591306920      bob.shults@mail.com   328278708432069254     test11@mail.com 11/01/2000 10:00:00
    38124472891255273775   carolyn.green@mail.com  1127901879852039037     test12@mail.com 12/01/2000 11:00:00
    29070047663451376630      chris.long@mail.com 27488842661591306920     test13@mail.com 13/01/2000 12:00:00
    8261398433828474582 christi.nicolay@mail.com 38124472891255273775     test14@mail.com 14/01/2000 13:00:00
    18727221862165338513  alan.aronowitz@mail.com 29070047663451376630     test15@mail.com 15/01/2000 14:00:00
    5680838251168988404     alan.comnes@mail.com  8261398433828474582     test16@mail.com 16/01/2000 15:00:00
    2351312285811012730       dab@sprintmail.com  2351312285811012730     test17@mail.com 17/01/2000 16:00:00
    328278708432069254      ana.correa@mail.com  7349515121496417787     test18@mail.com 18/01/2000 17:00:00
    1127901879852039037   andrew.fastow@mail.com 41762759923562968495     test19@mail.com 19/01/2000 18:00:00
    7349515121496417787 elena.kapralova@mail.com 24894056753582090007     test20@mail.com 20/01/2000 19:00:00
    27488842661591306920      bob.shults@mail.com 18727221862165338513 ana.correa@mail.com 01/01/2000 00:00:00
    27488842661591306920      bob.shults@mail.com 18727221862165338513 ana.correa@mail.com 02/01/2000 00:00:00
log <- union(levels(log[,3]), levels(log[,4]))
>Error in emails[, 3] : incorrect number of dimensions
library(digest)
email <- 'test1@gmail'
as.numeric(paste('0x', substr(rep(hmac('secret56f8a7', email, algo='md5'), 4), c(1, 9, 17, 25), c(8, 16, 24, 32)), sep=''))
log1$From <- as.factor(log1$From) 
log1$To <- as.factor(log1$To) 
emails <- union(levels(log1$From), levels(log1$To))
levels(log1$From) <- emails
levels(log1$To) <- emails
log1$From <- as.numeric(log1$From) 
log1$To <- as.numeric(log1$To)
log1[log1$From == which(emails == "test1@gmail.com"), ]