3

行数は異なりますが、列数は同じ 2 つのデータ フレームがあります。以下の例では、データ フレーム 1 は 4 x 2、データ フレーム 2 は 3 x 2 です。TRUE がデータ フレームのすべての行が一致することを示す 4 x 3 論理行列が必要です。この例は機能しますが、より大きなデータ フレームで実行するには非常に長い時間がかかります (約 5,000 行の 2 つのデータ フレームを試していますが、まだ 2 列しかありません)。これを行うより効率的な方法はありますか?

> df1 <- data.frame(row.names=1:4, var1=c(TRUE, TRUE, FALSE, FALSE), var2=c(1,2,3,4))
> df2 <- data.frame(row.names=5:7, var1=c(FALSE, TRUE, FALSE), var2=c(5,2,3))
> 
> m1 <- t(as.matrix(df1))
> m2 <- as.matrix(df2)
> 
> apply(m2, 1, FUN=function(x) { apply(m1, 2, FUN=function(y) { all(x==y) } ) })
      5     6     7
1 FALSE FALSE FALSE
2 FALSE  TRUE FALSE
3 FALSE FALSE  TRUE
4 FALSE FALSE FALSE

助けてくれてありがとう。

4

3 に答える 3

1

私は R ブロガーに関するあなたの投稿によってここに描かれました: http://jason.bryer.org/posts/2013-01-24/Comparing_Two_Data_Frames.html

あなたが言うように、データに数値ベクトルがない場合は、より高速なアプローチを提案できると思います。それはで構成されています:

  1. 2 つの data.frames を 2 つの整数行列に変換します
  2. 2 つのデータの行間のユークリッド距離を計算します

データを使用した簡単な例:

mat1 <- as.matrix(sapply(df1, as.integer))
mat2 <- as.matrix(sapply(df2, as.integer))
library(fields)
rdist(mat1, mat2) < 1e-9
#       [,1]  [,2]  [,3]
# [1,] FALSE FALSE FALSE
# [2,] FALSE  TRUE FALSE
# [3,] FALSE FALSE  TRUE
# [4,] FALSE FALSE FALSE

いくつかのコメント:

  1. データに文字のベクトルが含まれている場合は、それらを因子に変換し、それらが同じ因子水準を共有していることを確認する必要があります。
  2. このfieldsパッケージを使用して、ユークリッド距離を計算しました。これは Fortran 実装を使用しており、私が知る限り、このタスクで最速の R パッケージです (そして、私は多くのことをテストしました。信頼してください)。
于 2013-05-05T00:14:14.160 に答える
0

正直なところ、これがより高速になるかどうかはわかりませんが、試してみてください:

foo <- Vectorize(function(x,y) {all(df1[x,] == df2[y,])})
> outer(1:4,1:3,FUN = foo)
      [,1]  [,2]  [,3]
[1,] FALSE FALSE FALSE
[2,] FALSE  TRUE FALSE
[3,] FALSE FALSE  TRUE
[4,] FALSE FALSE FALSE

または==とは対照的に、比較に使用することの危険性について少なくとも言及しなければならないと感じています。これが問題にならないデータ型に十分慣れていると思います。all.equalidentical

于 2013-01-23T17:47:18.910 に答える