2017-12-19 2 views
0

Ich habe einen Datenrahmen, und wie bestimmte Werte zu ersetzen, wenn andere Werte in derselben Reihe eine bestimmte Bedingung erfüllen, zum Beispiel:basierend auf anderem Wert in DF

DF <- data.frame(a= c(2,4,67), 
       b= c("TSS",".","TSS"), 
       c= c(3,46,5), 
       d= c(45,"-",47)) 

ergeben:

a b c d 
1 2 TSS 3 45 
2 4 . 46 - 
3 67 TSS 5 47 

Jetzt möchte ich Werte in Zeile 2 Spalte c und d durch "." und [2, c], wenn der Wert von [2, b] "." ist. Das Ergebnis würde wie folgt aussehen:

a b c d 
1 2 TSS 3 45 
2 4 . . 46 
3 67 TSS 5 47 

I for-Schleife ein probiert, aber da ich eine große Datenmenge habe dies dauert zu lange. Gibt es einen besseren Weg, um dieses Problem zu lösen?

Antwort

1

Dies sollte funktionieren:

DF <- data.frame(
    a = c(2, 4, 67), 
    b = c("TSS", ".", "TSS"), 
    c = c(3, 46, 5), 
    d = c(45, "-", 47), 
    stringsAsFactors = FALSE 
) 


DF$d[DF$b == "."] <- DF$c[DF$b == "."] 
DF$c[DF$b == "."] <- "." 

Zuerst haben wir die d-Wert in Reihen ersetzen, wobei b ein "" mit dem Wert von c. Die zweite Zeile ersetzt dann den Wert in c durch ein ".".

> DF 
    a b c d 
1 2 TSS 3 45 
2 4 . . 46 
3 67 TSS 5 47 
+1

Dies wird nicht verallgemeinert. Was passiert mit mehr Spalten oder Wenn das '". "' In einer anderen Spalte gefunden wird? – Sotos

+0

Richtig, es verallgemeinert sich nicht. Ich dachte OP wollte eine Antwort für diesen speziellen Fall. Ich denke, eine generalisierte Lösung wäre, die Zeilen zu verschieben, in denen das "." tritt auf, beginnend mit der Spalte nach dem "." und füllen Sie es mit einem anderen ".". – brettljausn

+0

Ich stimme Ihrer Logik zu. Bitte bearbeiten Sie Ihre Antwort, um den allgemeinen Fall einzubeziehen, damit mehr Nutzer davon profitieren können. – Sotos

Verwandte Themen