2015-11-13 66 views
0

我的基因組數據的加載如下:找到所有連續的行具有相同值

chr leftPos Def 
1  23444  1 
1  63226 -1 
1  125325 -1 
2  12  -1 
3  5435  -1 
3  5675  0 
3  67868  0 
3  78999  0 
4  3465  1 
5  67868  1 
5  78979  1 
5  80988 -1 

對於每個$ CHR我想獲得其中上面的排在$防守同一條目中的所有行如下面的行在單獨的數據框中,保留兩行匹配。在$防守的入口可以是-1,0或1,但我沒有興趣在0

我不是困擾有關的盡頭,開始$ CHR發生什麼情況,這樣可以忽略不計。

我想這會在某種lapply的工作要做,但我不知道怎麼樣。

輸出應該是這個樣子:

chr leftPos Def 
1  63226 -1 
1  125325 -1 
5  67868  1 
5  78979  1 

感謝。我不知道如何解決這個問題。

+0

請提供多一點複雜的例子。 (df1,!is.na(Def)&Def!= 0,select = c('chr','leftPos','Def'))' – akrun

+0

我已經修改了數據集 –

+0

我更新瞭解決方案。請檢查是否有效。 – akrun

回答

2

我們可以使用rleiddata.table。將'data.frame'轉換爲'data.table'(setDT(df2)),根據運行長度類型id創建一個'ind'列。按'chr'和'ind'分組,爲'i'創建邏輯條件,if nrow大於1,我們將Data.table子集(.SD),並將'ind'分配給'NULL'。

library(data.table)#v1.9.6+ 
setDT(df1)[, ind:= rleid(Def)][!is.na(Def)&Def!=0, if(.N>1) .SD, .(chr, ind)] 
# chr leftPos Def 
#1: 1 63226 -1 
#2: 1 125325 -1 
#3: 5 67868 1 
#4: 5 78979 1 
+0

問題是,如果我在處理之前刪除了NAs和0,那麼我在我感興趣的行之間創建了一個錯誤的連續性。我想要找到連續性只有1和-1,因爲它位於由chr創建的數據框中。但是,如果我省略了他們的子集,我會得到所有連續的na和零,這是不好的。怎麼樣運行setDT就像連續1秒,然後連續-1s然後合併? –

+0

@SebastianZeki你可以使用一些NA元素以及我在評論中顯示的類似示例來更新,以便我們可以測試所有這些情況。 – akrun

+0

@SebastianZeki我更新了這篇文章。請檢查是否有效。 – akrun

相關問題