2列のチェーンに基づいてRデータテーブルを注文する方法を理解しようとしています。
これが私のサンプルのdata.tableです。
dt <- data.table(id = c('A', 'A', 'A', 'A', 'A')
, col1 = c(7521, 0, 7915, 5222, 5703)
, col2 = c(7907, 5703, 8004, 7521, 5222))
id col1 col2
1: A 7521 7907
2: A 0 5703
3: A 7915 8004
4: A 5222 7521
5: A 5703 5222
col1 = 0で始まる行の順序が必要です。行2のcol1の値は、前の行のcol2の値と等しくなければなりません。
さらに、通常、行の順序をつなぐ値が常に一致している必要があります。しかし、そうでない場合は、最も近い値を選択する必要があります(以下の行4および5を参照)。
私が探している結果を以下に示します。
id col1 col2
1: A 0 5703
2: A 5703 5222
3: A 5222 7521
4: A 7521 7907
5: A 7915 8004
私はこれを行うためにクレイジーな関数を書くことができると思います。しかし、エレガントなdata.tableソリューションがあるかどうか疑問に思っています。
編集
私はテーブルを更新して、重複する行と一意のソース列を持つ追加のIDを含めました:
dt <- data.table(id = c('A', 'A', 'A', 'A', 'A', 'B', 'B', 'B', 'B', 'B')
, col1 = c(7521, 0, 7915, 5222, 5703, 1644, 1625, 0, 1625, 1625)
, col2 = c(7907, 5703, 8004, 7521, 5222, 1625, 1625, 1644, 1625, 1505)
, source = c('c', 'b', 'a', 'e', 'd', 'y', 'z', 'x', 'w', 'v'))
id col1 col2 source
1: A 7521 7907 c
2: A 0 5703 b
3: A 7915 8004 a
4: A 5222 7521 e
5: A 5703 5222 d
6: B 1644 1625 y
7: B 1625 1625 z
8: B 0 1644 x
9: B 1625 1625 w
10: B 1625 1505 v
ID内に一致する値が存在する可能性があります。上記のB、行7および9を参照してください。ただし、このデータの取得元である行ごとに固有のソースがあります。
望ましい出力は次のようになります。
id col1 col2 source
1: A 0 5703 b
2: A 5703 5222 d
3: A 5222 7521 e
4: A 7521 7907 c
5: A 7915 8004 a
6: B 0 1644 x
7: B 1644 1625 y
8: B 1625 1625 w
9: B 1625 1625 z
10: B 1625 1625 v
出力では、一致する行8と9は任意の順序にすることができます。
ありがとう!
はい。思ったよりも。データセットの詳細については、編集された投稿を参照してください。
—
AlexP
col2
IDでの重複を持っていますか?あなたの例はそのまま動作しますが、それ以上の行がある場合、col2
1625または一致しないものになります。