2017-02-24 2 views
0

Ich habe einen data.frame mit 2 Spalten („X“ und „Y“), die wie folgt aussieht:entfernen Zeilen aus data.frame wo Zahlen innerhalb gegenüberliegenden Seiten der Saiten ein gemeinsames Muster teilen passen

X   Y 
1_SNP_3 4 
2_SNP_6 3 
3_SNP_1 4 
20_SNP_7 7 
7_SNP_20 7 

Mit grepl oder einer ähnlichen Funktion in R, möchte ich alle Elemente (Strings) in X vergleichen. Jede Zeichenfolge hat eine Nummer am Anfang und am Ende, und alle Zeichenfolgen teilen sich ein gemeinsames Teilzeichenmuster dazwischen ("__SNP_"). Ich möchte nur jene Zeilen entfernen, die, wenn die Zahlen innerhalb derselben Zeichenkette invertiert sind (z. B. von 1_SNP_3 zu 3_SNP_1), doppelte Zeichenketten bilden.

z.B. Wenn Zahlen in "1_SNP_3" invertiert werden, ergibt sich der String "3_SNP_1", der bereits existiert, sodass einer dieser Strings (und die entsprechende Zeile) entfernt wird.

Ich würde diese:

X   Y 
1_SNP_3 4 
2_SNP_6 3 
20_SNP_7 7 
+0

Warum '2_SNP_6' im Ergebnis ist? – zx8754

+1

@ zx8754 weil es keine 6_SNP_2 irgendwo gibt – Lucas

+1

Split auf "_" (es gibt viele Lösungen auf "wie Trennzeichen geteilt werden"), dann 1. und 3. in Zahlen umwandeln, diese 2 Nummern bestellen, SNP-Namen mit Paste wieder zusammensetzen und werde einzigartig. Versuchen Sie, wenn Sie stecken bleiben, aktualisieren Sie Ihren Post mit Problemen. – zx8754

Antwort

3

Hier ist eine Lösung Basis R. unter Verwendung

df[!duplicated(sapply(strsplit(gsub('\\D+', ' ', df$X), ' '), function(i) toString(sort(i)))),] 
#   X Y 
#1 1_SNP_3 4 
#2 2_SNP_6 3 
#4 20_SNP_7 7 
2
# My first answer submission - A data table solution 
# create the table 
DT <- data.table(X = c("1_SNP_3","2_SNP_6","3_SNP_1","20_SNP_7","7_SNP_20"), 
           Y = c(4,3,4,7,7)) 
DT 
# Extract first and last numbers 
DT[, ':=' (B = gsub("_.*","",X), 
       E = gsub(".*_SNP_","",X))] 
# Order the new columns so B is always less than E 
DT[DT$B > DT$E , c("B", "E")] <- DT[DT$B > DT$E , c("E", "B")] 

# Keep only the first instance , so delete duplicates 
DT <- DT[, .SD[1], by=c("B","E")] 
# Delete extra columns 
DT [,c("B","E") := NULL] 
DT 

Answer :  
    X Y 
1: 1_SNP_3 4 
2: 2_SNP_6 3 
3: 20_SNP_7 7 
Verwandte Themen