2016-08-19 70 views
0

我有一個數據幀:找出從數據框的斷裂(交叉)的位置r中

df = read.table(text="ID location C1 C2 C3 C4 C5 C6 
M01 1 A H H A A B 
M02 2 A H A A A B 
M03 3 A B A A A B 
M04 4 H B H A A B 
M05 5 H B H A A B 
M06 6 A B H A A H 
M07 7 A B H B A H 
M08 8 A B H A A H 
M09 9 A B H A A H 
M10 10 B B H A A H 
M11 11 A B H A A H 
M12 12 A B H A A H 
M13 13 A B H A A H 
M14 14 B B B A A H 
M15 15 B B B A A A", header=T, stringsAsFactors=F) 

我想找到交叉或破裂的位置(不同的字母之間的結,以每列)。例如,對於列C1,第一個結應該是第3行和第4行。從第1行到第3行,它們都是A。第4行是H。所以這個交叉點的位置是3.預期的結果是從C1C6的列表列表。

$C1    
3 5 9 10 13 
$C2    
2    
$C3    
1 3 13  
$C4    
6 7   
$C5    

$C6    
5 14   

感謝您的幫助。

回答

3

我們可以遍歷所有的「C」柱與lapply和比較相鄰元素找到索引

lapply(df[-(1:2)], function(x) which(x[-1]!= x[-length(x)])) 
#$C1 
#[1] 3 5 9 10 13 

#$C2 
#[1] 2 

#$C3 
#[1] 1 3 13 

#$C4 
#[1] 6 7 

#$C5 
#integer(0) 

#$C6 
#[1] 5 14 

或者,我們可以將run-length-encoding功能即rle,提取lengths,得到累計和並刪除最後一個元素。

lapply(df[-(1:2)], function(x) head(cumsum(rle(x)$lengths),-1)) 
+1

與'qtl' R軟件包中的'locateXO'函數相比,我感到很驚訝。 – user3354212

+0

@akrun:爲什麼用lapply(df [ - (1:2)],函數(x)(x [-1]!= x))有警告? –

+0

@ChirayuChamoli使用OP的數據,我沒有得到任何警告在R 3.3.0 – akrun