Tôi có 2 bảng (tham chiếu số &; ví dụ đồ chơi bên dưới). Các bảng này có các vị trí START và END mà tôi muốn kiểm tra các chồng chéo (sử dụng một cái gì đó như foverlaps từ gói data.table) và sau đó chia các giá trị như hiển thị bên dưới.R - Tách dòng khung dữ liệu thành hai hàng
>data <- data.table(ID=c(1,2,3), Chrom=c(1,1,2), Start=c(1,500,1000), End=c(900,5000,5000), Probes=c(899,4500,4500))
>Ref.table <- data.table(Chrom=c(1,2), Split=c(1000,2000))
>Ref.table
Chrom Split
1 1000
2 2000
>data
ID Chrom Start End Probes
1 1 1 900 899
2 1 500 5000 4500
3 2 1000 5000 4000
Như bạn có thể thấy, ID 1 không trùng lặp với bảng tham chiếu, vì vậy nó sẽ bị bỏ lại một mình. Tuy nhiên, ID 2 & 3, tôi muốn chia dựa trên Ref.table.
Bảng kết quả tôi muốn nhận được là:
>result
ID Chrom Start End Probes
1 1 1 900 899
2 1 500 1000 500
2 1 1001 5000 4000
3 2 1000 2000 1000
3 2 2001 5000 3000
Như tôi chắc chắn rằng bạn có thể thấy, có hai phần như sau: 1. chia phạm vi thành hai cột dựa trên một bảng riêng biệt 2. Phân chia # đầu dò tương ứng giữa hai phần
Tôi đã tìm kiếm gói R có thể thực hiện việc này (phạm vi phân chia bằng cánh tay nhiễm sắc thể), nhưng không thể tìm thấy điều đó như được hiển thị ở trên. Bất kỳ liên kết đến các gói chức năng sẽ được đánh giá cao, nhưng tôi cũng sẵn sàng để mã này bản thân mình ... với một chút giúp đỡ.
Cho đến nay, tôi đã chỉ có thể sử dụng foverlaps để xác định xem có sự chồng chéo: dụ:
>foverlaps(Ref.table[data[14]$Chrom], data[14], which=TRUE)
xid yid
1: 1 1
Điều này rất hữu ích, cảm ơn. Một trong những điều không hoạt động tốt là tỷ lệ Probesion (không chắc chắn tôi chỉ định rằng đúng trong câu hỏi anyway). Tôi đã thêm cột "Độ dài" để có độ dài ban đầu và sau đó thay vì "i.End - Start" trong câu trả lời của bạn, tôi đã làm "Đầu dò * ((i - Bắt đầu)/(Độ dài))". Trong trường hợp bất cứ ai khác đi đến câu hỏi này cho điều này, figured tôi muốn đặt nó ở đây. –
@GaiusAugustus Cảm ơn bạn đã bình luận. Tôi không nhớ câu hỏi là gì nữa nhưng tôi vui vì bạn đã tìm ra nó :) –