2016-06-03 14 views
0

Ich habe ein Problem mit einem Ersatz in r, ich habe eine Variable mit vielen Werten, die ich im Teilstring "fin" ersetzen möchte, ich möchte die Werte mit ersetzen hier ist weniger als 26 frecuency, mein Code:Ersetze verschiedene data.frame Teilstrings durch eine Variable in R

n.tab <- table(as.character(joined1$codigo)) 
    n.many <- names(n.tab[ n.tab < 26]) 
    length(n.many)#2311 NOTE: fin is made with paste of values, codigo is one of them 
    joinedAux<-joined #saving a copy 
    for (j in 1:length(n.many)) {#walk through elements of n.many 

     joinedAux$fin<-gsub(as.character(n.many[j]), "other", as.character(joined$fin))#substitute (not working) 

    } 

Und es kommt mit dieser Warnung: „die Anzahl der Elemente ist nicht ein Vielfaches der Länge des Ersatz zu ersetzen“

es macht nichts, wenn Ich schaue "joinedAux $ fin" es ist genau das selbe wie "joined $ fin". Hier ein Beispiel:

Joined$codigo Joined$fin 
12    12 valid high 
22    22 wrong un 
23    23 wrong in 
13    13 valid high 
15    15 valid very high 

Was ich brauche es nach der ersetzen zu sein:

Joined$codigo Joined$fin 
    12    other valid high #codigo in n.many 
    22    22 wrong un 
    23    other wrong in #codigo in n.many 
    13    other valid high #codigo in n.many 
    15    15 valid very high 

Vielen Dank im Voraus!

Antwort

1

Wenn ich Ihr Problem richtig verstehe, müssen Sie Ihre data.frame Schleife durchlaufen, anstatt die Teilmenge der Zeichenfolgen.

joinedAux$fin <- sapply(1:nrow(joinedAux), function(j) if(joined1$codigo[j] %in% n.many) gsub(joined1$codigo[j],'other',joined1$codigo[j]) else joined1$codigo[j]) 

Wenn Sie nicht zufrieden mit sapply sind, wird ein for-Schleife arbeiten, auch:

fin <- NULL 
for(j in 1:nrow(joinedAux)) fin[j] <- if(joined1$codigo[j] %in% n.many) gsub(joined1$codigo[j],'other',joined1$codigo[j]) else joined1$codigo[j]) 

Wenn Sie glücklich sind gsub zu vermeiden (was nicht mit Vektoren funktioniert), der einfachste Weg, wäre wahrscheinlich:

+0

Ich verstehe, was Sie meinen, aber (korrigieren Sie mich, wenn ich falsch liege) diese Implementierungen überschreiben die Daten bereits in $ Fin gespeichert, richtig? zum Beispiel "12 gültiges Hoch des nicht verarbeiteten Datenrahmens wurde" anderes "aber nicht" anderes gültiges hig "" Habe ich Recht? – Amnor

+0

Das ist richtig. Wenn Sie das 'valid high' hinzufügen möchten, überprüfen Sie 'str_replace' aus dem stringr-Paket. Dieser kann mit Vektoren umgehen und Sie können für die letzte Lösung verwenden. – jkt

+0

Ich werde es versuchen, ich werde mit den Ergebnissen informieren, danke! – Amnor

Verwandte Themen