Ich habe eine große Anzahl von Strings (~ 280.000), die alle das folgende Format "ABC12D/XYZ34A" haben. In meinen Daten hat jede dieser Zeichenfolgen einen doppelten Eintrag, der identisch ist, aber umgekehrt, z. "XYZ34A/ABC12D" für das obige Beispiel. So sieht meine Daten etwas wie folgt aus:Effiziente Suche nach umgekehrten Strings in R
1 "ABC12D/XYZ34A"
2 "TUR44F/SWP29R"
3 "PLL93S/WQQ22F"
4 "YNV77C/AAZ05S"
5 "SWP29R/TUR44F"
6 "AAZ05S/YNV77C"
7 "CLK86G/ERF74Q"
8 "XYZ34A/ABC12D"
9 "ERF74Q/CLK86G"
10 "WQQ22F/PLL93S"
Row 1 Treffer Reihe 8, Reihe 2 Streichhölzer Reihe 5 usw.
Meine Ziele sind: 1) für eine bestimmte Zeichenfolge, wo seine umgekehrt Eintrag diesen Index wird und halten und dann 2) die Rückbuchung mit dem nicht umgekehrten Eintrag ersetzen:
1 "ABC12D/XYZ34A" 8
2 "TUR44F/SWP29R" 5
3 "PLL93S/WQQ22F" 10
4 "YNV77C/AAZ05S" 6
5 "TUR44F/SWP29R" 0
6 "YNV77C/AAZ05S" 0
7 "CLK86G/ERF74Q" 9
8 "ABC12D/XYZ34A" 0
9 "CLK86G/ERF74Q" 0
10 "PLL93S/WQQ22F" 0
Derzeit ich tue dies in der folgenden Art und Weise mit einer Schleife:
df <- data.frame(c("ABC12D/XYZ34A", "TUR44F/SWP29R", "PLL93S/WQQ22F",
"YNV77C/AAZ05S", "SWP29R/TUR44F", "AAZ05S/YNV77C", "CLK86G/ERF74Q",
"XYZ34A/ABC12D", "ERF74Q/CLK86G", "WQQ22F/PLL93S"), stringsAsFactors =
FALSE)
colnames(df) <- "entries"
df
# Reverse function
reverse.entry <- function(string) {
string.reversed <- paste(rev(strsplit(string, "/")[[1]]), collapse = '/')
string.reversed
}
duplicate.flag <- list()
duplicate.idx <- list()
# Find and replace reversed entries
for (i in 1:dim(df)[[1]]) {
# current entry
string = df[i,]
# reverse the current entry
string.reversed <- reverse.entry(string)
# if any other entry matches the reversed string get match index
if (grepl(string.reversed, df)) {
print(sprintf("%d found a reversal", i))
idx <- which(df == string.reversed)
duplicate.flag[i] <- 1;
duplicate.idx[i] <- idx;
# replace reversed strings with original strings
df[idx,] <- string
} else {
duplicate.flag[i] <- 0;
duplicate.idx[i] <- 0;
}
}
data.frame(df, unlist(duplicate.idx), unlist(duplicate.flag))
Dies ist jedoch ziemlich langsam und dauert mehrere Stunden. Gibt es eine bessere Möglichkeit, dies zu programmieren? Ich bin ziemlich neu in R und Programmierung, also bin ich nicht besonders gut in der Vektorisierung usw. Da jeder Eintrag einen umgekehrten Eintrag hat, könnte ich auch einfach die Schleife für 1: dim (df) [[1]]/2 haben Schon viel Zeit sparen?
Vielen Dank!
Gibt es eine Regel zu identifizieren, die das Original ist und wer das Gegenteil? Kommt das Original im Datenrahmen an erster Stelle? – Lamia
Keine harte Regel und es spielt keine Rolle. Ich behandle das, das zuerst als das Original kommt, aber solange es am Ende übereinstimmt, ist es egal, welches man verändert hat. – KarenKoltrane