¿Cómo puedo dividir una cadena de caracteres en un marco de datos en varias columnas?

Estoy trabajando con un marco de datos, una columna de los cuales contiene valores que son en su mayoría numéricos pero pueden contener entradas no numéricas. Me gustaría dividir esta columna en varias columnas. Una de las nuevas columnas debe contener la parte numérica de la entrada original y otra columna debe contener elementos no numéricos.

Aquí hay un marco de datos de muestra:

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

Así es como me gustaría que se vea el marco de datos:

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

La característica de los datos que estoy aprovechando actualmente es que la estructura de las cadenas de caracteres es siempre la siguiente: los elementos no numéricos (si existen) siempre preceden a los elementos numéricos y los dos elementos siempre están separados por un espacio.

Puedo usar colsplit del paquete de remodelación para dividir la columna en función del espacio en blanco. El problema con esto es que replica cualquier entrada que no se puede dividir en dos elementos,

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

Esto no es terriblemente problemático, ya que puedo hacer un procesamiento posterior para eliminar los elementos numéricos de la columna "x1".

También puedo lograr lo que me gustaría hacer usando strsplit dentro de una función:

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      

Pero esto parece engorroso.

Básicamente, ambas opciones que he descrito aquí funcionarán. Pero sospecho que hay una forma más elegante o directa de obtener el marco de datos deseado.

Respuestas a la pregunta(2)

Su respuesta a la pregunta