2014-12-06 68 views
-1

我有兩個數據集(作爲數據框導入)。第一個數據框是染色體列表和染色體上的感興趣位置(Number,Qual和dt只是其他列)。數據框被稱爲SAM刪除列中的值與其他數據集的列中的值不匹配的所有行

Number Qual chr  leftPos  dt 
    3  0 chr1 4105086  255 
    4  16 chr1 4464364  255 
    5  16 chr1 4464390  255 
    6  16 chr1 9655049  255 
    7  16 chr1 9945004  255 
    etc 

第二個數據集(稱爲計數)包含沿着染色體染色體和立場,我感興趣的是:

Chr  Locus 
    chr1 4105086 
    chr1 4464364 

我想刪除SAM中的所有行是在計數中沒有Chr和Locus的相應組合。

輸出應該是這樣的:

Number Qual chr  leftPos  dt 
3   0 chr1  4105086  255 
4  16 chr1  4464364  255 

我不想合併,因爲我不想在原始數據集(SAM)我只是想基於第一數據集,以排除行額外列等。

+0

不太清楚使用合併,但我猜你應該看看'?merge'。 – nicola 2014-12-06 10:32:30

+0

當你想要合併的列被稱爲不同的東西時,你如何合併? – 2014-12-06 10:35:11

+1

查看'merge'的by.x'和'by.y'參數。 – nicola 2014-12-06 10:43:44

回答

2

看看這是你在找什麼

# sample data 
sam = structure(list(Number = 3:7, Qual = c(0L, 16L, 16L, 16L, 16L), 
    chr = structure(c(1L, 1L, 1L, 1L, 1L), .Label = "chr1", class = "factor"), 
    leftPos = c(4105086L, 4464364L, 4464390L, 9655049L, 9945004L 
    ), dt = c(255L, 255L, 255L, 255L, 255L)), .Names = c("Number", 
"Qual", "chr", "leftPos", "dt"), class = "data.frame", row.names = c(NA, 
-5L)) 

counts = structure(list(Chr = structure(c(1L, 1L), .Label = "chr1", class = "factor"), 
    Locus = c(4105086L, 4464364L)), .Names = c("Chr", "Locus" 
), class = "data.frame", row.names = c(NA, -2L)) 

library(dplyr) 
new_data = sam %>% filter(paste0(chr,"_",leftPos) %in% 
          with(counts, paste0(Chr,"_",Locus))) 
new_data 
# Number Qual chr leftPos dt 
# 1  3 0 chr1 4105086 255 
# 2  4 16 chr1 4464364 255 

或者作爲建議

new_data = merge(sam, counts, by.x=c("chr","leftPos"), by.y=c("Chr","Locus")) 
new_data = new_data[,c(3,4,1,2,5)] 
# Number Qual chr leftPos dt 
# 1  3 0 chr1 4105086 255 
# 2  4 16 chr1 4464364 255 
+0

確定不能使用合併,因爲這會改變我不想要的原始數據集。愚蠢的問題,但你如何輸出dplyr答案到一個新的數據框? – 2014-12-06 12:35:09

+0

@ user3632206,請參閱編輯。實際上,您可以在合併後重新排列這些列。 – KFB 2014-12-06 12:40:24

+0

好吧,我寧可選擇dplyr路由,因爲它只是過濾而不是改變數據。但是,它似乎沒有過濾數據 - 沒有錯誤消息,但似乎沒有過濾。合併路徑確實會過濾,但是必須發生的所有列重新排列都會使代碼變得龐大。 – 2014-12-06 23:48:46

相關問題