这是我在R中运行的代码:
options(stringsAsFactors=FALSE)
x=read.table("sample.txt")
y=read.table("comp.txt")
nrowx=nrow(x)
nrowy=nrow(y)
for(i in 1:nrowx)
{
flag=0
for(j in 1:nrowy)
{
if(x[i,2]==y[j,2])
{
x[i,2]=y[j,1]
flag=1
break
}
}
if(flag==0)
x[i,]=NA
}
这里x有2,000,000个条目,而y有大约2,500个条目。执行25个x条目(按照代码)需要大约1分钟。
在x:
中读取文件的几行"X1" "X2"
"1" 53 "all.downtown@enron.com"
"2" 54 "all.enron-worldwide@enron.com"
"3" 55 "all.worldwide@enron.com"
"4" 56 "all_enron_north.america@enron.com"
"5" 56 "ec.communications@enron.com"
"6" 57 "charlotte@wptf.org"
"7" 58 "sap.mailout@enron.com"
"8" 59 "robert.badeer@enron.com"
"9" 60 "tim.belden@enron.com"
"10" 60 "robert.badeer@enron.com"
"11" 60 "jeff.richter@enron.com"
"12" 60 "valarie.sabo@enron.com"
"13" 60 "carla.hoffman@enron.com"
"14" 60 "murray.o neil@enron.com"
"15" 60 "chris.stokley@enron.com"
在y中读取文件的几行:
"X1" "X2"
"1" 1 "jeff.dasovich@enron.com"
"2" 2 "kay.mann@enron.com"
"3" 3 "sara.shackleton@enron.com"
"4" 4 "tana.jones@enron.com"
"5" 5 "vince.kaminski@enron.com"
"6" 6 "pete.davis@enron.com"
"7" 7 "chris.germany@enron.com"
"8" 8 "matthew.lenhart@enron.com"
"9" 9 "debra.perlingiere@enron.com"
"10" 10 "mark.taylor@enron.com"
"11" 11 "gerald.nemec@enron.com"
"12" 12 "richard.sanders@enron.com"
"13" 13 "james.steffes@enron.com"
"14" 14 "steven.kean@enron.com"
"15" 15 "susan.scott@enron.com"
请建议一些替代方法来加快执行速度。 谢谢! :)
答案 0 :(得分:2)
如果我理解正确的话:
如果x的电子邮件存在于y中,那么在y中取出属于emailadress的号码,并用这个y的号码替换x的电子邮件地址?
x:
中行的可能最终结果"100" 60 11
"101" NA NA
所以也许试试这个:
x <- as.matrix(x)
y <- as.matrix(y)
# This matcher is about 2 times faster than the built-in match() function.
matcher <- function(i) {
w <- which(x[i,2] == y[,2])
ifelse(length(w) > 0, y[w[1],1], NA)
}
x[,2] <- sapply(1:2000000, function(i) matcher(i))
x[is.na(x[,2]), 1] <- NA
也许首先测试100,000个案例,看看速度是多少:
sapply(1:100000, function(i) matcher(i))
它更快的原因是因为你没有在循环中做循环,而是对问题进行矢量化并使用快速查找匹配方法。
由于这很容易并行,因此请考虑这一点(如果您的机器有4个核心):
myParallel <- function(cores, x, y) {
require(parallel)
cl <- makeCluster(cores)
unlist(parSapply(cl, 1:2000000, function(i) matcher(i))
}
x[,2] <- myParallel(cores=4, x, y)
它可能只允许你在2分钟内完成,而不是当前的5分30秒!