2011-11-17 2 views
4

Rの2つのデータフレームにはそれぞれIPアドレスのフィールドが含まれています。各データフレームでは、これらのフィールドは「要因」です。ユーザは、これらのIPアドレスおよび他のいくつかのフィールドに基づいて2つのデータフレームをマージしようとします。問題は、各データフレームは、IPアドレスのために異なるフォーマットを有していることである。RのIPアドレスの先行ゼロを効率的に削除(または追加)するには?

Dataframe A examples: 123.456.789.123, 123.012.001.123, 987.001.010.100 

データフレームBの同じIPアドレスのようにフォーマットされます:削除するいずれかの最高の(最も効率的)な方法は何

Dataframe B examples: 123.456.789.123, 123.12.1.123, 987.1.10.100 

Aからの先頭の0をBに追加して、マージで使用できるようにしますか?操作は何百万ものレコードにわたって実行されるため、「最も効率的」は計算時間を考慮したものです(比較的高速にする必要があります)。

答えて

6

sprintfを使用してセクションの書式を設定できます。たとえば、あなたが次のことを行うことができ、与えられた数値aのために:だから

b <- sprintf("%.3d", a) 

、IPアドレスのため、この機能を試してみてください。

printPadded <- function(x){ 
    retStr = paste(sprintf("%.3d",unlist(lapply(strsplit(x,"\\.", perl = TRUE), as.numeric))), collapse = ".") 
    return(retStr) 
} 

ここでは2つの例を示します。

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

printPadded関数内の分割された値にgsubを使用して、先行ゼロを削除することができます。私のお金のために、先行ゼロを削除しないことをお勧めします。 0を取り除く(またはそれらを埋め込む)必要はありませんが、固定幅の書式は読みやすく、並べ替えが簡単です(つまり、辞書編集関数をソートする場合)。


アップデート1:ただスピードの提案:あなたはIPアドレスの多くに対処し、本当にこれをスピードアップしたい場合は、あなたがそのようなmclapplyとして、マルチコアの方法で見えるかもしれません。 plyrパッケージも便利です(ddply())。これらは、.parallel = TRUEを介してパラレルバックエンドもサポートしています。それでも、数百万のIPアドレスが単一のコアであっても非常に長い時間を費やすべきではありません。 sprintfのに必要な部門の全体の多くよりも

my @ipparts = split(/\./, $ip); 
for my $ii (0..$#ipparts) 
{ 
    $ipparts[$ii] = $ipparts[$ii]+0; 
} 
$ip = join(".", @ipparts); 

よりよい:

+0

お返事ありがとうございました。エラーが発生しています ** strsplit(x、 "\\。"、perl = TRUE)のエラー:文字以外の引数** 現在はファクタレベルなのでas.characterを実行する必要がありますか? – bnjmn

+0

私は** lapply(as.character(data $ IP)、printPadded)**を成功させました。ありがとう。答えを受け取る前に数時間待っています。 – bnjmn

+0

@Benjamin Ah、あなたは要因に注意する必要があります。時には文字ベクトルのように見えることもありますが、整数として扱われることもあります。データをロードする場合、 'read.csv()'と言って、 'stringsAsFactors = FALSE'オプションを探します。あるいは、オプションでこれを設定することもできます。 '?options'を見てください。 FWIW、私は因子としてストリングをロードすることから決して恩恵を受けたことはありません - 必要なときに明示的な因子変換を行うだけです(例えば特定のタイプのモデルでは) – Iterator

2

もう一つの方法は、このようなものです。

関連する問題