2

正規表現を使用して単語のさまざまな組み合わせの集計値を計算するデータ セットを作成しています。各行には一意の正規表現値があり、これを別のデータセットと照合して、出現回数を調べたいと考えています。

最初のデータセット (df1) は次のようになります。

   word1    word2               pattern
   air      10     (^|\\s)air(\\s.*)?\\s10($|\\s)
 airport    20   (^|\\s)airport(\\s.*)?\\s20($|\\s)
   car      30     (^|\\s)car(\\s.*)?\\s30($|\\s)

これと一致させたい他のデータセット(df2)は次のようになります

   sl_no    query
   1      air 10     
   2    airport 20   
   3    airport 20
   3    airport 20
   3      car 30

最終的な出力は、word1 word2 total_occ air 10 1 airport 20 3 car 30 1 のようになります。

Rでapplyを使用してこれを行うことができます

process <- 
function(x) 
{
  length(grep(x[["pattern"]], df2$query))
}           

df1$total_occ=apply(df1,1,process)

私のデータセットはかなり大きいので、時間がかかります。

「parallel」パッケージの「mclapply」機能を使用して、マルチコアでそのようなことを実行できることがわかりました。そのために、最初にlapplyを実行しようとしています。それは私にエラーを与えています

lapply(df,process)

x[, "pattern"] のエラー: 次元数が正しくありません

lapply を正しく実行するには、どのような変更を加える必要があるか教えてください。

4

1 に答える 1

3

なぜちょうどlapply()上ではないのpatternですか?

ここで私はあなたを引き出しましたpatternが、これは簡単にdf$pattern

pattern <- c("(^|\\s)air(\\s.*)?\\s10($|\\s)",
             "(^|\\s)airport(\\s.*)?\\s20($|\\s)",
             "(^|\\s)car(\\s.*)?\\s30($|\\s)")

データの使用目的df2

txt <- "sl_no    query
   1      'air 10'     
   2    'airport 20'   
   3    'airport 20'
   3    'airport 20'
   3      'car 30'"
df2 <- read.table(text = txt, header = TRUE)

pattern直接繰り返すだけ

> lapply(pattern, grep, x = df2$query)
[[1]]
[1] 1

[[2]]
[1] 2 3 4

[[3]]
[1] 5

質問で提案されているように、よりコンパクトな出力が必要な場合は、lengths()返された出力を実行する必要があります (新しい関数を指摘してくれた@Franklengths()に感謝します)。例えば

lengths(lapply(pattern, grep, x = df2$query))

を与える

> lengths(lapply(pattern, grep, x = df2$query))
[1] 1 3 1

これを元のデータに追加するには、

dfnew <- cbind(df1[, 1:2],
               Count = lengths(lapply(pattern, grep, x = df2$query)))
于 2015-06-17T16:07:29.813 に答える