2017-11-13 1 views
0

Ich versuche, eine Reihe von Zahlen in einer Zeichenfolge durch Informationen zu ersetzen, die von einem Datenframe stammen.ungerades Verhalten beim Ersetzen von Teilen einer Zeichenfolge innerhalb einer for-Schleife

Meine Zeichenfolge stammt aus einer Textdatei, die ich mit dem Readr-Paket wie folgt importiert: read_file("Human.txt") Ich habe die Klasse überprüft, es ist ein Zeichen. Die Zeichenfolge enthält die folgenden Informationen (ich es treeString benannt haben):

"(1,2,((((3),884),(((((519,((516,517),(515,(518,(513,514))))),((((((((458,(457,(455,456))),459),(502,(454,(453,(451,452)))))"

Meine Datenrahmen (labels.csv) war ursprünglich in Faktor-Format, aber ich änderte das Format der zweiten Spalte zum Charakter der Verwendung folgender Befehl: labels[,2] = as.character(labels[,2]). Es sieht aus wie dieses

 v1  v2 
1 1  name1 
2 2  name2 
3 3  name3 

Mein Ziel jede Zahl in der Zeichenfolge mit dem entsprechenden Namen (das heißt V2) in dem Datenrahmen zu ersetzen ist. Dies sollte folgendes Ergebnis:

"(name1,name2,((((name3),884),(((((519,((516,517),(515,(518,(513,514))))),((((((((458,(457,(455,456))),459),(502,(454,(453,(451,452)))))"

Hier ist der Code, den ich dies zu tun bin mit:

for(i in 1:nrow(labels)){ 
    gsub(as.character(i), labels[i,2], treeString) 
} 

Die seltsame Sache ist, dass, wenn ich laufe die gsub() Befehl auf seinem eigenen (mit bestimmten Nummern - zB 2) tut es die Ersetzung, aber wenn ich es in einer Schleife laufe, ersetzt es nicht die Zahlen.

+3

In Ihrem Code, die Ergebnisse nicht zurück zu TreeString Variable –

+0

Vielen Dank, das hat es gelöst! – Lupy

Antwort

2

Wie Kumar Manglam in den Kommentaren darauf hingewiesen hat, haben Sie vergessen, das Ergebnis gsub() zurück an treeString zu vergeben.

Es gibt noch etwas, das Sie beachten sollten: Die Art und Weise, wie Sie den regulären Ausdruck in Ihrer Frage angegeben haben, ersetzt auch Muster wie "(241)" mit "(name24name1)". Um dieses Verhalten zu vermeiden, sollten Sie prüfen, ob die Zahlen, die Sie durch ein Komma oder öffnende Klammer sind voran ersetzen wollen und durch ein Komma oder schließenden Klammer gelungen:

# Option1 
for(i in 1:nrow(labelnames)){ 
    reg_pattern <- paste0("(?<=[(,])(", i, ")(?=[),])") 
    treeString <- gsub(reg_pattern, labelnames$v2[i], treeString, perl=T) 
} 

Eine andere, schönere, ist Möglichkeit, die for fallen -loop und tun es alle auf einmal:

# Option2 
reg_pattern <- paste0("(?<=[(,])([1-", nrow(labelnames), "])(?=[),])") 
treeString <- gsub(reg_pattern, "name\\1", treeString, perl=T) 

# Result 
treeString 
# "(name1,name2,((((name3),884),(((((519,((516,517),(515,(518,(513,514))))),((((((((458,(457,(455,456))),459),(502,(454,(453,(451,452)))))" 

Daten

treeString <- "(1,2,((((3),884),(((((519,((516,517),(515,(518,(513,514))))),((((((((458,(457,(455,456))),459),(502,(454,(453,(451,452)))))" 
labelnames <- structure(list(v1 = 1:3, v2 = c("name1", "name2", "name3")), .Names = c("v1", "v2"), class = "data.frame", row.names = c(NA, -3L)) 
+0

Sorry, aber in diesem Fall passiert nichts, d. H. Nichts wird ersetzt. Dies ist der Fall, wenn ich die Linien selbst führe und wenn ich sie in einer Schleife laufe – Lupy

+0

Haben wir die gleiche Dateneingabe? Weil es für mich funktioniert –

Verwandte Themen