0

だから、私は2列の文字を持つ非常に巨大なデータフレームを持っています。文字は、「;」で区切られた ID 値です。したがって、これら 2 つの列の間で共通する ID 値の数を計算したいと思います。次に例を示します。

   id.x                  id.y
1  123;145;156       143;156;234;165
2  134;156;187;675   132;145;156;187

したがって、この場合、最初の行には 1 つの共通値があり、2 番目の行には 2 つの共通値があります。

テーブルのサイズは 60M レコードで、一部の文字列の長さは 1000 を超える場合があります。データをテキストファイルに書き込んでpythonで解析しようとしたのですが、ファイルサイズが30GBあります。Rでこれを行うアイデアはありますか? (正規表現、適用、..)

次のコマンドで、共通値の数を数えることができます。

intersect(strsplit(df[1,"ind.x"], split=";")[[1]], strsplit(df[1,"ind.y"], split=";") [[1]])

したがって、私は関数を書きました:

myfun <- function(x,y) {
   length(intersect(strsplit(x, split=";")[[1]], strsplit(y, split=";")[[1]]))
}

単一の呼び出しで試してみると機能しますが、以下のように mapply で使用すると、すべての列が出力されますが、出力には数値のみが必要です。

> mapply(FUN=myfun, df[1:2,]$id.x, df[1:2,]$id.y)
123;145;156 134;156;187;675 
          1               2

では、なぜ最初の列も出力するのでしょうか? コマンドの何が問題になっていますか?

4

1 に答える 1

1

Mapply は、name 属性を持つ整数ベクトルを返します。

y <- mapply(myfun, df$id.x, df$id.y)
str(y)
Named int [1:2] 1 2
- attr(*, "names")= chr [1:2] "123;145;156" "134;156;187;675"

それらを USE.NAME でドロップします

mapply(myfun, df$id.x, df$id.y, USE.NAMES=FALSE)
[1] 1 2

そして、インデックスを使用して、ますます大規模なデータセットで時間をテストします

system.time(y <- mapply(myfun, df[1:1e5,]$id.x, df[1:1e5,]$id.y, USE.NAMES=FALSE))
于 2013-10-18T20:58:46.703 に答える