Wie kann ich eine Zeichenfolge in einem Datenrahmen in mehrere Spalten aufteilen?

Ich arbeite mit einem Datenrahmen, von dem eine Spalte Werte enthält, die größtenteils numerisch sind, aber möglicherweise nicht numerische Einträge enthalten. Ich möchte diese Spalte in mehrere Spalten aufteilen. Eine der neuen Spalten sollte den numerischen Teil des ursprünglichen Eintrags enthalten, und eine andere Spalte sollte nicht numerische Elemente enthalten.

Hier ist ein Beispieldatenrahmen:

df <- data.frame(ID=1:4,x=c('< 0.1','100','A 2.5', '200')) 

Hier ist, wie der Datenrahmen aussehen soll:

ID   x1   x2
1    <    0.1
2         100
3    A    2.5
4         200

in Merkmal der Daten, die ich derzeit nutze, ist, dass die Struktur der Zeichenfolgen immer wie folgt ist: Die nicht numerischen Elemente (sofern vorhanden) stehen immer vor den numerischen Elementen, und die beiden Elemente werden immer durch ein Leerzeichen getrennt .

Ich kann colsplit aus dem Reshape-Paket verwenden, um die Spalte basierend auf Leerzeichen zu teilen. Das Problem dabei ist, dass es jeden Eintrag repliziert, der nicht in zwei Elemente aufgeteilt werden kann,

require(reshape)
df <- transform(df, x=colsplit(x,split=" ", names("x1","x2")))
df
ID  x1   x2
1   <    0.1
2   100  100
3   A    2.5
4   200  200

Dies ist nicht besonders problematisch, da ich nur einige Nachbearbeitungen durchführen kann, um die numerischen Elemente aus der Spalte "x1" zu entfernen.

Ich kann auch mit strsplit in einer Funktion ausführen, was ich tun möchte:

split.fn <- function(id){
 new.val <- unlist(strsplit(as.character(df$x[df$ID==id])," "))
   if(length(new.val)==1){
     return(data.frame(ID=id,x1="NA",x2=new.val))
   }else{
     return(data.frame(ID=id,x1=new.val[1],x2=new.val[2]))
   }  

}
data.frame(rbindlist(lapply(unique(df$ID),split.fn)))
ID   x1   x2
1    <    0.1
2    NA   100
3    A    2.5
4    NA   200      

aber das scheint umständlich.

rundsätzlich funktionieren beide Optionen, die ich hier skizziert habe. Aber ich vermute, es gibt einen eleganteren oder direkteren Weg, um den gewünschten Datenrahmen zu erhalten.

Antworten auf die Frage(4)

Ihre Antwort auf die Frage