2016-10-03 4 views
0

ich eine Spalte in einem data.frame zu leeren initialisieren wollen sehen so:Fügen Sie eine Spalte data.frame

df$newCol = 1 

wo df ist ein data.frame, die ich früher definiert haben und bereits einige Verarbeitung erfolgt auf . Solange nrow (df)> 0, das ist kein Problem, aber manchmal meine data.frame hat Zeilenlänge 0 und I erhalten:

> df$newCol = 1 
Error in `[[<-`(`*tmp*`, name, value = 1) : 
1 elements in value to replace 0 elements 

Ich kann durch die Änderung meiner ursprünglichen Linie zu

dieses Problem umgehen

aber das scheint ein bisschen ungeschickt und ist rechenintensiv, wenn die Anzahl der Zeilen in df groß ist. Gibt es eine eingebaute oder Standardlösung für dieses Problem? Oder sollte ich einige benutzerdefinierte Funktion verwenden, wie so

addCol = function(df,name,value) { 
    if(nrow(df)==0){ 
    df[,name] = rep(value,0) 
    }else{ 
    df[,name] = value 
    } 
    df 
} 

Antwort

5

Wenn ich richtig verstehe,

df = mtcars[0, ] 
df$newCol = numeric(nrow(df)) 

sollte es sein?

Das setzt voraus, dass Sie mit „Zeilenlänge“ nrows bedeuten, wobei in diesem Fall benötigen Sie einen Vektor der Länge 0. In einem solchen Fall anhängen, Sie numeric(nrow(df)) wird genau das gleiche Ergebnis wie rep(0, nrow(df)) geben.

Es geht auch davon aus, dass Sie nur eine neue Spalte brauchen, und nicht speziell Spalte von Einsen - dann würden Sie einfach +1, die eine vektorisierte Operation und daher schnell ist.

Ansonsten bin ich nicht sicher, ob Sie eine "leere" Spalte haben können - der Vektor sollte die gleiche Anzahl von Elementen wie die anderen Vektoren im Datenrahmen haben. Aber numeric ist schnell, es sollte nicht weh tun.

Verwandte Themen