R中的两个数据帧都包含IP地址字段.在每个数据帧中,这些字段是"因子".用户打算基于这些IP地址以及一些其他字段合并两个数据帧.问题是每个数据帧都有不同的IP格式:
Dataframe A examples: 123.456.789.123, 123.012.001.123, 987.001.010.100
Run Code Online (Sandbox Code Playgroud)
Dataframe B中的相同IP格式为:
Dataframe B examples: 123.456.789.123, 123.12.1.123, 987.1.10.100
Run Code Online (Sandbox Code Playgroud)
从A中删除前导零或将它们添加到B以便它们可以在合并中使用的最佳(最有效)方法是什么?该操作将在数百万条记录上执行,因此"最有效"是考虑到计算时间(需要相对较快).
您可以使用sprintf格式化部分.例如,对于给定的数值,您可以执行以下操作a:
b <- sprintf("%.3d", a)
Run Code Online (Sandbox Code Playgroud)
因此,对于IP地址,请尝试以下功能:
printPadded <- function(x){
retStr = paste(sprintf("%.3d",unlist(lapply(strsplit(x,"\\.", perl = TRUE), as.numeric))), collapse = ".")
return(retStr)
}
Run Code Online (Sandbox Code Playgroud)
这是两个例子:
> printPadded("1.2.3.4")
[1] "001.002.003.004"
> lapply(c("1.2.3.4","5.67.100.9"), printPadded)
[[1]]
[1] "001.002.003.004"
[[2]]
[1] "005.067.100.009"
Run Code Online (Sandbox Code Playgroud)
为了进入另一个方向,我们可以使用函数中gsub的分割值删除前导零printPadded.对于我的钱,我建议不要删除前导零.没有必要删除零(或填充它们),但固定宽度格式更容易阅读和排序(即对于那些排序函数的词典).
更新1:只是一个速度建议:如果你正在处理大量的IP地址,并且真的想加快速度,你可能会考虑多核方法,例如mclapply.作为一个选项plyr,该包也很有用ddply().这些也支持并行后端,通过.parallel = TRUE.尽管如此,即使在单核上,几百万个IP地址也不会花费很长时间.