2015-02-06 112 views
-1

我写了一个R脚本,并在16个变量和1 000 000个观测值的数据帧上执行它,但尚未完成。是否有可能改进此代码以获得速度?

for(i in seq_along(cp.up$Connection.Number)){ 
if (nchar(cp.up$IMEI[i]) == 14){ 
    cp.up$IMEI.enrichi[i] <- substr(cp.up$IMEI[i], 1, 8) 
} else if(nchar(cp.up$IMEI[i] == 13)){ 
    cp.up$IMEI.enrichi[i] <- substr(cp.up$IMEI[i], 1, 7) 
} else { 
    cp.up$IMEI.enrichi[i] <- NA 
    } 
} 

该代码运行良好,因为当我停止该过程时,部分fataframe已满。

在此先感谢!

编辑:ifelse语句解决问题,

chars <-nchar(cp.up$IMEI) 
cp.up$IMEI.enrichi <- ifelse(chars == 14, substring(cp.up$IMEI, 1, 8), 
         ifelse(chars == 13,substring(cp.up$IMEI, 1, 7), NA)) 
+0

什么是cp.up?你可以输入数据吗? – 2015-02-06 16:42:51

+5

'sapply'不会加速任何事情。 – Roland 2015-02-06 16:43:27

+0

cp.up是一个数据框! – 2015-02-06 16:44:29

回答

1

有多少你的字符串的长度有13和14?如果是只有少数可能更快与NA填写您的载体,然后用适当的子字符串替换那几个值开始:

cp.up$IMEI.enrichi <- NA 
tmp.nchar <- nchar(cp.up$IMEI) 
w1 <- which(tmp.nchar ==14) 
cp.up$IMEI.enrichi[ w1 ] <- substr(cp.up$IMEI[w1], 1, 8) 
w2 <- which(tmp.nchar == 13) 
cp.up$IMEI.enrichi[ w2 ] <- sustr(cp.us$IMEI[w2], 1, 7) 

这甚至可能会更快,当大多数串有13首或14个字符因为您正在利用矢量化函数,而不是在每次迭代中进行比较。

另一种方法来查看您的计算机是否具有多个核心(或者您可以访问具有多个核心的计算机,您可以运行该核心,某些云计算系统可以让您的空闲时间开始,涵盖了你需要的东西),然后查看Rdsm软件包和并行软件包,以便可以在数据框的不同部分填充不同的核心。 pbd软件包也可以在这里工作,但我认为Rdsm的方法可能是最简单和最快的启动和运行。

+0

谢谢greg,6/10字符串的长度是14,3/10的长度是13和1/10是NA。你的代码比ifelse语句中的$ nicolas响应快一点。感谢你的信息。 – 2015-02-06 17:42:29

相关问题