forループを使用せずに、複数の基準に基づいて異なるデータフレームの行を照合します

シャロン

私のデータには2つの異なるデータフレームが含まれています。

visits <- data.frame("visit_nr", "label", "degree", "code")
category <- data.frame("label", "degree", "group", "code1", "code2, "code3")

2つのデータフレーム間の「ラベル」、「度」、「コード」の一致に基づいて、データフレーム「訪問」のすべての訪問にグループを割り当てたいと思います。ただし、特定の「visit_nr」の行は、データフレーム「category」の「code2」と「code3」もデータフレーム「visits」にリストされている場合にのみ、特定のグループに割り当てることができます。つまり、行を特定のグループに割り当てるには、同じ「visit_nr」を持つ3つの行が必要です。ここで「label」は次のようになります。「度」と「コード」は次のいずれかに一致します。

- "label", "degree", "code1"
- "label", "degree", "code2"
- "label", "degree", "code3" 

これらのデータフレームには両方とも50000を超える行が含まれているため、これを実現するためにループを使用することは避けたいと思います。

訪問

visit_nr   | label | degree | code   |  Group
1601704801 |  171  |    1   | 354373 |   0
1601704801 |  171  |    1   | 200200 |   0
1601704801 |  171  |    1   | 973443 |   0
1601704801 |  171  |    1   | 475985 |   0
1601704801 |  171  |    1   | 994320 |   0

カテゴリー

label | degree | group | code1 | code2 | code3
 171  |   1    |   2   | 354373| 200200| 475985 
 171  |   1    |   3   | 354373| 200200| 998282
 171  |   1    |   1   | 354373| 200200| 0

期待される出力:

visit_nr   | label | degree | code   |  Group 
1601704801 |  171  |    1   | 354373 |   2
1601704801 |  171  |    1   | 200200 |   2
1601704801 |  171  |    1   | 973443 |   2
1601704801 |  171  |    1   | 475985 |   2
1601704801 |  171  |    1   | 994320 |   2
Uwe

categoryワイドフォーマットからロングフォーマットに再形成し、結合してvisits、一致するコードの数をカウントする代替アプローチがあります。

library(data.table)
# reshape from wide to long format
lcat <- melt(setDT(category), measure.vars = patterns("^code"),
     value.name = "code")
# join and count
tmp <- lcat[setDT(visits), on = .(label, degree, code), nomatch = 0L][
  , .N, by = .(visit_nr, label, degree, group)][
    N == 3L]
tmp[]
     visit_nr label degree group N
1: 1601704801   171      1     2 3
# update join
visits[tmp, on = .(visit_nr, label, degree), Group := group, mult = "first"][]
visits[]
     visit_nr label degree   code Group
1: 1601704801   171      1 354373     2
2: 1601704801   171      1 200200     2
3: 1601704801   171      1 973443     2
4: 1601704801   171      1 475985     2
5: 1601704801   171      1 994320     2

編集

コメント、OPがあることが開示されています

code2code3データフレームのすべての行にcategory値があるわけではありませんまたcode1、0とは異なる値のみcode2code3持ち、値が0である場合もあります。この場合visit_nr、一致するグループを全体に割り当てるには、最初のコードのみが特定の範囲内に存在する必要があります。visit_nr

したがって、正確に3つの一致するコードがあるかどうかの簡単なチェックは、サンプルデータセットでは機能しますが、OPの本番データセットでは機能しません。

追加の要件は、次の2つの変更でカバーできると思います。

  1. のすべての行code == 0がから削除されますlong
  2. tmp複数の一致が含まれている場合は、最も高いものNが選択されます。同点がある場合which.max()は、最初に遭遇したものを選択します。

したがって、コードは次のようになります。

library(data.table)
lcat <- melt(setDT(category), measure.vars = patterns("^code"),
             value.name = "code")[code != 0]
tmp <- lcat[setDT(visits), on = .(label, degree, code), nomatch = 0L][
  , .N, by = .(visit_nr, label, degree, group)][
    , .SD[which.max(N)], by = .(visit_nr, label, degree)]
visits[tmp, on = .(visit_nr, label, degree), Group := group]
visits[]
     visit_nr label degree   code Group
1: 1601704801   171      1 354373     2
2: 1601704801   171      1 200200     2
3: 1601704801   171      1 973443     2
4: 1601704801   171      1 475985     2
5: 1601704801   171      1 994320     2

データ

library(data.table)

visits <- fread("
visit_nr   | label | degree | code   |  Group
1601704801 |  171  |    1   | 354373 |   0
1601704801 |  171  |    1   | 200200 |   0
1601704801 |  171  |    1   | 973443 |   0
1601704801 |  171  |    1   | 475985 |   0
1601704801 |  171  |    1   | 994320 |   0
")

category <- fread("
label | degree | group | code1 | code2 | code3
 171  |   1    |   2   | 354373| 200200| 475985 
 171  |   1    |   3   | 354373| 200200| 998282
 171  |   1    |   1   | 354373| 200200| 0
")

この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。

侵害の場合は、連絡してください[email protected]

編集
0

コメントを追加

0

関連記事

分類Dev

複数の行条件に基づいて2つの異なるデータフレームを比較します

分類Dev

複数の基準に基づいてデータフレームをグループに分類する方法

分類Dev

複数の列と行の基準に基づいてRデータフレームを展開します

分類Dev

異なるデータフレームから複数の条件に基づいてデータフレームの行を削除します

分類Dev

異なるデータフレームから複数の条件に基づいてデータフレームの行を削除します

分類Dev

複数の選択基準に一致する2つの異なるデータフレームの行に基づいて3番目のデータフレームを構築します

分類Dev

複数の基準に基づいて2つのデータフレームを結合する

分類Dev

2つの基準に基づいて2つのデータフレームの変数を照合および合計する効率的な方法

分類Dev

特定の基準に基づいて他の複数のデータフレームを使用してデータフレームを作成する

分類Dev

列名の複数の基準に基づいてデータフレーム列を抽出します

分類Dev

Googleスプレッドシートの複数の基準に基づいて、別のセルから動的な値を照合または取得する方法

分類Dev

複数の列に基づいてRのデータフレーム行を結合します

分類Dev

リストの最初の要素に基づいて照合するデータフレームを作成します

分類Dev

forループを使用して複数のデータフレームのIDに基づいて行をフィルタリングする

分類Dev

pandasデータフレームの条件に基づいて、セルを複数の行に分割/分解します

分類Dev

異なるデータフレームの等しい値に基づいて行を選択します

分類Dev

異なる行の列に基づいてデータフレームをマージします

分類Dev

R:カスタム距離関数と複数の基準に基づいてレコードをすばやく照合します

分類Dev

SQLは、異なるフィールドに基づいて複数の行フィールドを1つのレコードに結合します

分類Dev

条件に基づいてSparkデータフレーム列の複数の行を組み合わせる

分類Dev

複数の列の文字列照合に基づいてPandasデータフレームの行を選択する方法

分類Dev

列の複数の値に基づいてデータフレームに新しい行を作成します

分類Dev

前の複数の行/列の値に基づいてデータフレームの行を削除します

分類Dev

dplyrによる別のデータフレームとの照合に基づいて、データフレームの列名を変更します

分類Dev

複数の列に基づいて、形状が異なる2つのデータフレーム間で複数の列を減算します

分類Dev

* argsを使用して関数内のベースのデータフレームに基づいて年に基づいて行をドロップする方法

分類Dev

idフィルター基準に基づいて複数の行を合計する方法は?

分類Dev

行名に基づいて複数のデータフレームをマージ/左結合する方法

分類Dev

Pythonは、別のデータフレームの列値に基づいて列名を照合します

Related 関連記事

  1. 1

    複数の行条件に基づいて2つの異なるデータフレームを比較します

  2. 2

    複数の基準に基づいてデータフレームをグループに分類する方法

  3. 3

    複数の列と行の基準に基づいてRデータフレームを展開します

  4. 4

    異なるデータフレームから複数の条件に基づいてデータフレームの行を削除します

  5. 5

    異なるデータフレームから複数の条件に基づいてデータフレームの行を削除します

  6. 6

    複数の選択基準に一致する2つの異なるデータフレームの行に基づいて3番目のデータフレームを構築します

  7. 7

    複数の基準に基づいて2つのデータフレームを結合する

  8. 8

    2つの基準に基づいて2つのデータフレームの変数を照合および合計する効率的な方法

  9. 9

    特定の基準に基づいて他の複数のデータフレームを使用してデータフレームを作成する

  10. 10

    列名の複数の基準に基づいてデータフレーム列を抽出します

  11. 11

    Googleスプレッドシートの複数の基準に基づいて、別のセルから動的な値を照合または取得する方法

  12. 12

    複数の列に基づいてRのデータフレーム行を結合します

  13. 13

    リストの最初の要素に基づいて照合するデータフレームを作成します

  14. 14

    forループを使用して複数のデータフレームのIDに基づいて行をフィルタリングする

  15. 15

    pandasデータフレームの条件に基づいて、セルを複数の行に分割/分解します

  16. 16

    異なるデータフレームの等しい値に基づいて行を選択します

  17. 17

    異なる行の列に基づいてデータフレームをマージします

  18. 18

    R:カスタム距離関数と複数の基準に基づいてレコードをすばやく照合します

  19. 19

    SQLは、異なるフィールドに基づいて複数の行フィールドを1つのレコードに結合します

  20. 20

    条件に基づいてSparkデータフレーム列の複数の行を組み合わせる

  21. 21

    複数の列の文字列照合に基づいてPandasデータフレームの行を選択する方法

  22. 22

    列の複数の値に基づいてデータフレームに新しい行を作成します

  23. 23

    前の複数の行/列の値に基づいてデータフレームの行を削除します

  24. 24

    dplyrによる別のデータフレームとの照合に基づいて、データフレームの列名を変更します

  25. 25

    複数の列に基づいて、形状が異なる2つのデータフレーム間で複数の列を減算します

  26. 26

    * argsを使用して関数内のベースのデータフレームに基づいて年に基づいて行をドロップする方法

  27. 27

    idフィルター基準に基づいて複数の行を合計する方法は?

  28. 28

    行名に基づいて複数のデータフレームをマージ/左結合する方法

  29. 29

    Pythonは、別のデータフレームの列値に基づいて列名を照合します

ホットタグ

アーカイブ