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

njc

Rには、1行に1つの個人を持つデータフレームがあります。個人が2行に表示されることがありますが、重複したIDに基づいてこれらの行を組み合わせたいと思います。

問題は、各個人が複数のIDを持っており、IDが2回表示される場合、必ずしも同じ列に表示されるとは限らないことです。

データフレームの例を次に示します。

dat <- data.frame(a = c('cat', 'canine', 'feline', 'dog'),
                  b = c('feline', 'puppy', 'meower', 'wolf'),
                  c = c('kitten', 'barker', 'kitty', 'canine'),
                  d = c('shorthair', 'collie', '', ''),
                  e = c(1, 5, 3, 8))

> dat
       a      b      c         d e
1    cat feline kitten shorthair 1
2 canine  puppy barker    collie 5
3 feline meower  kitty           3
4    dog   wolf canine           8

したがって、行1のbIDaは行3のID等しいため、行1と3を組み合わせる必要があります。同様に、a行2のIDcは行4のID等しいため、これらの行も組み合わせる必要があります。

理想的には、出力は次のようになります。

     a.1    b.1    c.1       d.1 e.1    a.2    b.3    c.2 d.2 e.2
1    cat feline kitten shorthair   1 feline meower  kitty       3
2 canine  puppy barker    collie   5    dog   wolf canine       8

(空の文字列である共有IDに基づいて行が結合されていないことに注意してください。)

これをどのように行うことができるかについての私の考えは以下のとおりですが、私は間違った道を進んでいると確信しているので、おそらく問題の解決には役立たないでしょう。

各行に行IDを割り当てて、データを溶かすことができると思いました。その後、私は行ごとに通過することができました。IDの1つが前の行と一致する行を見つけた場合(たとえば、行3のIDの1つが行1のIDの1つと一致する場合)、現在の行の行IDのすべてのインスタンスを変更して前の行IDと一致させます(たとえば、3のすべての行IDが1に変更されます)。

これが私が使用しているコードです:

dat$row.id <- 1:nrow(dat)
library(reshape2)
dat.melt <- melt(dat, id.vars = c('e', 'row.id'))
for (i in 2:nrow(dat.melt)) {
  # This next step is just to ignore the empty values
  if (grepl('^[[:space:]]*$', dat.melt$value[i])) {
    next
  }
  earlier.instance <- dat.melt$row.id[which(dat.melt$value[1:(i-1)] == dat.melt$value[i])]
  if (length(earlier.instance) > 0) {
    earlier.row.id <- earlier.instance[1]
    dat.melt$row.id[dat.melt$row.id == dat.melt$row.id[i]] <- earlier.row.id
  }
}

このアプローチには2つの問題があります。

  1. 行3のIDが行1と一致し、行5の別のIDが行3と一致する可能性があります。この場合、行3と行5の両方の行IDを1に変更する必要があります。これは、次のことが重要であることを意味します。行を順番に調べていくと、apply関数ではなくforループを使用するようになりました。これはあまりRに似ていないことを私は知っています、そして私が扱っている大きなデータフレームではそれは非常に遅いです。
  2. このコードは、以下の出力を生成します。そこ複数の行は同じとなりましたrow.idし、variable私は上記示した出力の種類を取得するためには、それをキャストする方法がわからないので、。dcastここで使用すると、集計関数を使用するように強制されます。

出力:

   e row.id variable     value
1  1      3        a       cat
2  5      2        a    canine
3  3      3        a    feline
4  8      2        a       dog
5  1      3        b    feline
6  5      2        b     puppy
7  3      3        b    meower
8  8      2        b      wolf
9  1      3        c    kitten
10 5      2        c    barker
11 3      3        c     kitty
12 8      2        c    canine
13 1      3        d shorthair
14 5      2        d    collie
15 3      3        d          
16 8      2        d          
moman822

新しい答え。これを介して作業するいくつかの楽しみ(/欲求不満)がありました。それが最速の解決策ではないと確信していますが、他の答えが中断したところを乗り越える必要があります。説明させてください:

dat <- data.table(a = c('cat', 'canine', 'feline', 'dog', 'cat','fido'),
                  b = c('feline', 'puppy', 'meower', 'wolf', 'kitten', 'dog'),
                  c = c('kit', 'barker', 'kitty', 'canine', 'feline','wolf'),
                  d = c('shorthair', 'collie', '', '','',''),
                  e = c(1, 2, 3, 4, 5, 6))

dat[, All := paste(a, b,c),]

2つの変更:dat$e現在はインデックス列であるため、どちらの行でも数値の位置になります。eそれ以外の点で重要な場合は、新しい列を作成して置き換えることができます。

以下は最初のループです。これにより、3つの新しい列FirstMatchingIDなどが作成されます。これらは以前と同様です。これらはdat$Alla bおよびに一致する最も早い(最も低い行番号)のインデックスを提供しますc

for(i in 2:nrow(dat)) {
  x <- grepl(dat[i]$a, dat[i-(1:i)]$All)
  y <- max(which(x %in% TRUE))
  dat[i, FirstMatchingID := dat[i-y]$e]

  x2 <- grepl(dat[i]$b, dat[i-(1:i)]$All)
  y2 <- max(which(x2 %in% TRUE))
  dat[i, SecondMatchingID := dat[i-y2]$e]

  x3 <- grepl(dat[i]$c, dat[i-(1:i)]$All)
  y3 <- max(which(x3 %in% TRUE))
  dat[i, ThirdMatchingID := dat[i-y3]$e]

}

次に、を使用pminして、列の最も早い一致行を見つけ、MatchingIDそれを独自の列に設定します。これは、a行25に一致しb、行12に一致する場合ですそれはあなたに12を与えるでしょう(私はこれがあなたの質問に基づいてあなたが望むものであると思います)。

dat$MinID <- pmin(dat$FirstMatchingID, dat$SecondMatchingID, dat$ThirdMatchingID, na.rm=T)

最後に、このループは3つのことを実行し、以下FinalIDから一致するすべてのID番号を含む列を作成しますe

  1. (一致しない)MinIDどこにNA設定されFinalIDていますかe
  2. MinIDが数字の場合、その行(最も早い一致)を見つけて、それ MinIDが数字かどうかを確認します。そうでない場合、以前の一致はなく、次のように設定さFinalIDれます。MinID
  3. 上記の条件に当てはまらない行は、行iの最初の一致がそれ自体より前の一致を持つ特殊なケースです。これにより、その一致が検出され、に設定されFinalIDます。

for (i in 1:nrow(dat)) { x <- dat[i]$MinID if (is.na(dat[i]$MinID)) { dat[i, FinalID := e] } else if (is.na(dat[x]$MinID)) { dat[i, FinalID := MinID] } else dat[i, FinalID := dat[x]$MinID] }

これでうまくいくと思います。どうなるか教えてください。私はその効率や速度については何も主張しません。

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

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

編集
0

コメントを追加

0

関連記事

分類Dev

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

分類Dev

複数の行を列の値ごとに1つの行に結合し、複数の列について、連結された行の数に基づいて複数のデータフレームに分割します

分類Dev

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

分類Dev

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

分類Dev

Rの条件に基づいて、データフレームに複数の新しい列を追加します

分類Dev

pandas-複数の行の値に基づいて、合計された列データの行をデータフレームに追加します

分類Dev

Rの複数の列に基づいて2つのデータフレームをマージします

分類Dev

複数の列間の接続に基づいて、データフレームの行を削除します

分類Dev

Rの別のデータフレームのメタデータ情報に基づいてデータフレーム列を結合します

分類Dev

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

分類Dev

Daskデータフレーム-区切り文字に基づいて列を複数の行に分割します

分類Dev

R dplyr / tidyverseデータフレームの複数の列に基づいて最大日付を取得します

分類Dev

列に基づいて行を結合するRデータフレーム

分類Dev

Python-パンダ-カテゴリ値に基づいて、データフレーム内で複数の列の行を1つの行に結合する

分類Dev

rの複数の列に基づいて、データフレーム内の重複する行を検索します

分類Dev

共通の列に基づいて、データフレームを別の列と結合します

分類Dev

Pandasデータフレーム-複数の条件計算に基づいて複数の列を作成します

分類Dev

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

分類Dev

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

分類Dev

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

分類Dev

dplyrデータフレームの単一の列に基づいて複数の列を変更します

分類Dev

個々のデータフレームの行インデックス(数)に基づいて、複数のデータフレームを連結/結合/マージします

分類Dev

Rの範囲値に基づいて2つのデータフレームを結合します

分類Dev

Rデータフレーム-2つの変数に基づいて行のペアを抽出し、カスタムのcolwise関数に基づいて行を結合します

分類Dev

複数の列としきい値に基づいてデータフレームをマージします

分類Dev

列に基づいて2つのデータフレームを結合します

分類Dev

リスト列に基づいて2つのパンダデータフレームを結合します

分類Dev

列の関数の結果に基づいてPandasデータフレームをスライスします

分類Dev

特定の条件に基づいて、データフレームの1つの列のすべての行を複数の列に転置します

Related 関連記事

  1. 1

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

  2. 2

    複数の行を列の値ごとに1つの行に結合し、複数の列について、連結された行の数に基づいて複数のデータフレームに分割します

  3. 3

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

  4. 4

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

  5. 5

    Rの条件に基づいて、データフレームに複数の新しい列を追加します

  6. 6

    pandas-複数の行の値に基づいて、合計された列データの行をデータフレームに追加します

  7. 7

    Rの複数の列に基づいて2つのデータフレームをマージします

  8. 8

    複数の列間の接続に基づいて、データフレームの行を削除します

  9. 9

    Rの別のデータフレームのメタデータ情報に基づいてデータフレーム列を結合します

  10. 10

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

  11. 11

    Daskデータフレーム-区切り文字に基づいて列を複数の行に分割します

  12. 12

    R dplyr / tidyverseデータフレームの複数の列に基づいて最大日付を取得します

  13. 13

    列に基づいて行を結合するRデータフレーム

  14. 14

    Python-パンダ-カテゴリ値に基づいて、データフレーム内で複数の列の行を1つの行に結合する

  15. 15

    rの複数の列に基づいて、データフレーム内の重複する行を検索します

  16. 16

    共通の列に基づいて、データフレームを別の列と結合します

  17. 17

    Pandasデータフレーム-複数の条件計算に基づいて複数の列を作成します

  18. 18

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

  19. 19

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

  20. 20

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

  21. 21

    dplyrデータフレームの単一の列に基づいて複数の列を変更します

  22. 22

    個々のデータフレームの行インデックス(数)に基づいて、複数のデータフレームを連結/結合/マージします

  23. 23

    Rの範囲値に基づいて2つのデータフレームを結合します

  24. 24

    Rデータフレーム-2つの変数に基づいて行のペアを抽出し、カスタムのcolwise関数に基づいて行を結合します

  25. 25

    複数の列としきい値に基づいてデータフレームをマージします

  26. 26

    列に基づいて2つのデータフレームを結合します

  27. 27

    リスト列に基づいて2つのパンダデータフレームを結合します

  28. 28

    列の関数の結果に基づいてPandasデータフレームをスライスします

  29. 29

    特定の条件に基づいて、データフレームの1つの列のすべての行を複数の列に転置します

ホットタグ

アーカイブ