2016-08-19 2 views
0

Ich habe einen Datenrahmen:Standorte der Pausen (Crossover) von einem Datenrahmen in 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) 

Ich mag würde die Standorte von Überkreuzungen oder Brüche (die Übergänge zwischen verschiedenen Buchstaben für jede Spalte) zu finden. Zum Beispiel sollte für Spalte C1 die erste Verbindung Zeile 3 und Zeile 4 sein. Von Zeile 1 bis Zeile 3 sind sie alle A. Zeile 4 ist H. Der Ort dieser Kreuzung ist also 3. Das erwartete Ergebnis ist eine Liste von Spalten von C1 bis C6.

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

$C6    
5 14   

Danke für Hilfe.

Antwort

3

Wir können eine Schleife über die ‚C‘ Spalten mit lapply und die benachbarten Elemente vergleichen, den Index

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 

Oder wir können die run-length-encoding Funktion dh rle zu finden, gelten die lengths extrahieren, erhalten die Summensumme und entferne das letzte Element.

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

Ich bin überrascht von Ihrem einfachen Ansatz, im Vergleich zu der Funktion 'locateXO' in' qtl' R-Paket. – user3354212

+0

@akrun: Warum gibt es eine Warnung mit "lapply" (df [- (1: 2)], Funktion (x) welche (x [-1]! = X))? –

+0

@ChirayuChamoli Unter Verwendung der OP-Daten erhalte ich keine Warnungen in R 3.3.0 – akrun

Verwandte Themen