是否有可能改进此代码以获得速度?

时间:2015-02-06 16:35:58

标签: r

我写了一个R脚本,并在一个包含16个变量和1 000 000个obsevation的数据帧上执行它但尚未完成。

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))

1 个答案:

答案 0 :(得分: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个字符时,这可能会更快,因为你正在利用向量化函数而不是在每次迭代中进行if比较。

另一种方法来查看您的计算机是否具有多于1个核心(或者您可以访问具有多个核心的计算机,您可以运行此计算机,某些云系统可以为您提供免费的启动时间,这可能超过您需要的是什么)然后查看Rdsm软件包以及并行软件包,以便您可以在数据框的不同部分填充不同的核心。 pbd软件包在这里可能也可以正常工作,但我认为Rdsm方法可能最简单,最快速的启动和运行。

相关问题