2017-06-10 25 views
7

Tôi đang cố gắng xóa các hàng trong một data.frame trong đó giá trị trong cột posn không nằm trong phạm vi được đưa ra trong một data.frame khác, với tính năng kết nối không tham gia của data.table.Làm cách nào để giữ cột tham gia không thay đổi trong dữ liệu tham gia không tham gia?

Sau đây là cách dữ liệu của tôi trông giống như:

library(data.table) 
df.cov <- 
    structure(list(posn = c(1, 2, 3, 165, 1000), att = c("a", "b", 
    "c", "d", "e")), .Names = c("posn", "att"), row.names = c(NA, 
    -5L), class = "data.frame") 
df.exons <- 
    structure(list(start = c(2889, 2161, 277, 164, 1), end = c(3329, 
    2826, 662, 662, 168)), .Names = c("start", "end"), row.names = c(NA, 
    -5L), class = "data.frame") 

setDT(df.cov) 
setDT(df.exons) 

df.cov 
# posn att 
# 1: 1 a 
# 2: 2 b 
# 3: 3 c 
# 4: 165 d 
# 5: 1000 e 
df.exons # ranges of `posn` to include 
# start end 
# 1: 2889 3329 
# 2: 2161 2826 
# 3: 277 662 
# 4: 164 662 
# 5:  1 168 

Đây là những gì tôi đã cố gắng:

df.cov[df.exons, on = .(posn >= start, posn <= end), nomatch = 0] 
# posn att posn.1 
# 1: 164 d 662 
# 2: 1 a 168 
# 3: 1 b 168 
# 4: 1 c 168 
# 5: 1 d 168 

Bạn có thể thấy rằng posn cột trong df.cov cũng được thay đổi. Kết quả mong đợi trông như sau:

# posn att 
# 1: 165 d 
# 2: 1 a 
# 3: 2 b 
# 4: 3 c 
# 5 165 d 
# the row order doesn't matter. I'll sort by posn latter. 
# It is also fine if the duplicated rows are removed, otherwise I'll do this in next step. 

Làm cách nào để có được kết quả mong muốn với data.table không tham gia?

+0

'df.cov [df.cov [df.exons, trên = (posn> = bắt đầu, posn <= kết thúc), nomatch = 0, trong đó = TRUE]] 'Tôi đã đệ đơn FR cho loại đăng ký này https://github.com/Rdatatable/data.table/issues/2158 (không chắc chắn liệu điều đó có hợp lý hay không, vì không ai có trả lời cho nó được nêu ra). Để loại bỏ các bản dupes, chỉ cần áp dụng 'unique' cho vector' which' trước khi subsetting. – Frank

+0

Tôi đã hỏi một câu hỏi có liên quan một chút trước đây: [Sử dụng 'j' để chọn cột nối của' x' và tất cả các cột không tham gia của nó] (https://stackoverflow.com/questions/42329157/use-j- to-select-the-join-column-of-x-và-tất-cả-số-không-tham-cột) – Henrik

+1

@Frank, cảm ơn. Dưới đây là những gì tôi cuối cùng đã dựa trên của bạn: 'df.cov [sắp xếp (duy nhất (df.cov [df.exons, trên =. (Posn> = bắt đầu, posn <= end), nomatch = 0, mà = TRUE]))] '. Tôi đọc FR của bạn và tôi nghĩ rằng một tính năng như vậy sẽ thực sự hữu ích trong nhiều trường hợp như thế này. – mt1022

Trả lời

6

Bạn cũng có thể sử dụng %inrange%:

df.cov[posn %inrange% df.exons] 

mà kết quả trong:

posn att 
1: 1 a 
2: 2 b 
3: 3 c 
4: 165 d 

Như bạn có thể thấy điều này khiến các giá trị của posn -column không thay đổi.


khác, mặc dù còn, possiblity:.

df.exons[df.cov 
     , on = .(start <= posn, end >= posn) 
     , mult ='first' 
     , nomatch = 0 
     , .(posn = i.posn, att)][] 
+1

Thật dễ dàng. Tôi chưa bao giờ nhận thấy chức năng bí mật này trước đây. – mt1022

+0

@ mt1022 đã thêm tùy chọn khác – Jaap

+0

Tôi không mong đợi bạn sẽ dành thời gian để tìm giải pháp phù hợp với yêu cầu của tôi trong bài đăng. Cảm ơn rất nhiều vì cách tiếp cận "không tham gia". – mt1022

Các vấn đề liên quan