Tôi đang cố gắng tìm ra cách đặt hàng bảng dữ liệu R dựa trên chuỗi 2 cột.
Đây là dữ liệu mẫu của tôi.
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
Tôi cần thứ tự hàng để bắt đầu với col1 = 0. Giá trị col1 ở hàng 2 phải bằng giá trị của col2 ở hàng trước, v.v.
Ngoài ra, thường phải luôn có một giá trị khớp để xâu chuỗi thứ tự hàng. Nhưng nếu không, cần chọn giá trị gần nhất (xem hàng 4 & 5 bên dưới).
Kết quả tôi đang tìm kiếm được hiển thị dưới đây:
id col1 col2
1: A 0 5703
2: A 5703 5222
3: A 5222 7521
4: A 7521 7907
5: A 7915 8004
Tôi nghĩ rằng tôi có thể viết một hàm điên để làm điều này .. nhưng tôi tự hỏi liệu có một giải pháp dữ liệu thanh lịch.
EDIT
Tôi đã cập nhật bảng để bao gồm một ID bổ sung với các hàng trùng lặp và một cột nguồn duy nhất:
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
Có thể có các giá trị khớp trong một ID. Xem B, hàng 7 & 9 ở trên. Tuy nhiên, có một nguồn duy nhất cho mỗi hàng nơi dữ liệu này đến từ.
Đầu ra mong muốn sẽ là:
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
Trong đầu ra, các hàng khớp nhau, 8 & 9 có thể theo bất kỳ thứ tự nào.
Cảm ơn!
col2
có bản sao trong một ID? Ví dụ của bạn sẽ hoạt động như bình thường nhưng nếu có thêm hàng nào,col2
sẽ là 1625 hoặc không khớp.