2017-11-10 1 views
0

Ich habe einen Datenrahmen mit zwei Spalten, die erste enthält Zahlen, die zweite Zeichenketten. Mein Problem ist: Sobald ich eine Zeichenfolge in der zweiten Spalte durch eine andere Zeichenfolge ersetzen, wird die erste Spalte von class numerisch in Zeichen umgewandelt. Hier ein Beispiel:Numerische Spalte wird zur Zeichenspalte gezwungen, wenn eine andere Zeichenspalte geändert wird

df <- data.frame(num = c(1,2), char = c("a", "b"), stringsAsFactors = F) 
class(df$num) # "numeric" 
class(df$char) # "character" 
df[df$char == "a", ] <- "c" 
class(df$char) # "character" 
class(df$num) # "character" !! 

Was ist der Grund für dieses Verhalten und wie man es stoppt?

Antwort

2

Ich habe meinen Fehler gefunden: df[df$char == "a", ] <- "c" überschreibt die ganze Zeile, weshalb die erste Spalte erzwungen wird. Der richtige Weg, um "a" durch "c" zu ersetzen, ist: df$char[df$char == "a"] <- "c".

+2

Nichts ist falsch mit Ihrer Antwort. Eine andere Option ist 'df [df [[" char "]] ==" a "," char "] <-" c "'. Es ist gut, beides zu wissen, weil das in Ihrer Antwort ein wenig einfacher zu tippen ist, aber das in meinem Kommentar wird mit Variablen arbeiten. '$' funktioniert nicht mit Variablen, zB wenn Sie 'my_col <-" char "' haben, dann funktioniert 'df [df [[my_col]] ==" a ", my_col] <-" c "' . – Gregor

0

Blick auf df, nachdem Sie es ändern:

> df 
    num char 
1 c c 
2 2 b 
> 

So natürlich $ num hat Charakter. Ihr Befehl hat (aufgrund seiner Kommasyntax) ganze Zeilen identifiziert, die geändert werden müssen.

Eine andere Substitution Befehl

df[df == "a"] <- "c" 

tut, was Sie erwartet hatten.

Verwandte Themen