2

これは私のデータ(A)です。

    keyword
[1] shoes
[2] childrenshoes
[3] nikeshoes
[4] sportsshiirts
[5] nikeshirts
[6] shirts
...

また、それは別のデータ (B) です。参考データです。

   keyword  value
[1] shoes    1
[2] shirts   2
...

このデータセットを一致させる必要があります。

だから、私はその結果を望んでいます。

    keyword        vlaue
[1] shoes          1
[2] childrenshoes  1     (because, this keyword include the 'shoes')
[3] nikeshoes      1     (because, this keyword include the 'shoes')
[4] sportsshiirts  2     (because, this keyword include the 'shirts')
[5] nikeshirts     2     (because, this keyword include the 'shirts')
[6] shirts         2
...

「マージ」を利用すると、このデータセットと一致しなくなります。これは、data(B) のキーワードが data(A) のデータと完全に一致していないためです。

regexpr() または gregexpr() を使用して、これを 1 つずつ処理できます。ただし、データには多くの参照があります(B)

では、どうすればこの問題を処理できますか?

4

1 に答える 1

6

1 つのアプローチを次に示します。

まず、あなたのデータ:

temp <- c("shoes", "childrenshoes", "nikeshoes", 
          "sportsshiirts", "nikeshirts", "shirts")

matchme <- structure(list(keyword = c("shoes", "shirts"), value = 1:2), 
                     .Names = c("keyword", "value"), 
                     class = "data.frame", row.names = c(NA, -2L))

第二に、出力はすべて一度に:

data.frame(
  keyword = temp, 
  value = rowSums(sapply(seq_along(matchme[[1]]), function(x) {
    temp[grepl(matchme[x, 1], temp)] <- matchme[x, 2]
    suppressWarnings(as.numeric(temp))
  }), na.rm = TRUE))
#         keyword value
# 1         shoes     1
# 2 childrenshoes     1
# 3     nikeshoes     1
# 4 sportsshiirts     0
# 5    nikeshirts     2
# 6        shirts     2

grepldata.frameソースの "temp" に対して"matchme" の各要素の論理マッチングを実行しますdata.frame。一致が見つかった場合、「matchme」の「value」列から値を抽出しますdata.frame。それ以外の場合は、元の値を保持します。as.numericを使用して結果のベクトルを変換すると、数値に強制できないものはすべて になることがわかっているので、それで問題ありませんNA

このsapplyステップでは、マトリックスを取得します。アイテムごとに 1 つの一致のみが存在すると想定できる場合は、rowSumsそのna.rm = TRUE行列を「一時」データと組み合わせて結果のdata.frame.

そこに を追加しました。まだ知らないことは何も教えてくれないsuppressWarnings多くの警告が表示されることがわかっているからです。NAs introduced by coercion

0「sportsshiirts」の に注意してください。おおよその一致が必要な場合agrepは、このアプローチを変更できるかどうかを調べて確認することをお勧めします。

于 2013-01-30T07:19:44.657 に答える