1

2つのデータフレームがあります

df1 <- data.frame(col11=c("a","a","a","b","b"), col=c(1,2,3,4,5))
df2 <- data.frame(col21=c("c","c","d","d","d"), col=c(1,5,1,2,5))

とのグループに基づく 2 つのデータフレーム間で同じ値を持つindex1行の数、および両方のデータフレームの一意の値の数としてカウントしたい。次に、とのグループの各カップルについて、 /によって計算される比率を取りたいと思います。私がしたことは、内部結合テーブルと外部結合テーブルを使用して、これらの中間データフレームを数えて作成することですcolcol11df1col21df2index2colindex3index1index2col11col21index1index2

df3 <- data.frame(group11=c("a","a","b","b"), group21=c("c","d","c","d"), index1=c(1,2,1,1))
df4 <- data.frame(group11=c("a","a","b","b"), group21=c("c","d","c","d"), index2=c(5,6,4,5))

  

この結果のデータフレームを持つ

df5 <- data.frame(group11=("a","a","b","b"), group21=c("c","d","c","d"), index3=c(0.2,0.33,0.25,0.2))

結合テーブルを使用せず、中間データフレームを作成せずに、結果のデータフレームを取得するのを手伝ってもらえますか? ありがとうございました。

4

2 に答える 2

1

これは、残念ながらまだ多くの結合がある

library(data.table)
df1 <- data.frame(col11=c("a","a","a","b","b"), col=c(1,2,3,4,5))
df2 <- data.frame(col21=c("c","c","d","d","d"), col=c(1,5,1,2,5))
setDT(df1)
setDT(df2)

res = CJ(col11 = df1[["col11"]], col21 = df2[["col21"]], unique = TRUE)

res[, index1 := df1[df2, on = .(col)][, .N, keyby = .(col11, col21)]$N]
res[, index2 := mapply(function(x, y) length((c(df1[col11 == x, col], df2[col21 == y, col]))), col11, col21)]
res[, index3 := index1 / index2][]
#>     col11  col21 index1 index2    index3
#>    <char> <char>  <int>  <int>     <num>
#> 1:      a      c      1      5 0.2000000
#> 2:      a      d      2      6 0.3333333
#> 3:      b      c      1      4 0.2500000
#> 4:      b      d      1      5 0.2000000

の参照セマンティクスを使用data.tableして呼び出し内で data.table を直接更新するため、追加のオブジェクトはありません。

  1. すべてのCJ(...)ユニークな組み合わせを設定することです。
  2. index1 := df1[df2, ...]結合構文の後に、各組み合わせの数 (.N) を決定します。res注:これkeybyをに戻さなくても安全だと思いますCJ
  3. このmapply(...)呼び出しは、resfor each の組み合わせで各行をフィルター処理する派手なループです。colがユニークかどうかについては、フィードバックに応じて変更します。

最後に、これには単純な解決策がないことを指摘する価値があります。これらの呼び出しが長くなりすぎないように、中間の計算ステップがあります。

于 2020-07-04T04:25:23.313 に答える