2010-03-06 14 views
5

Estoy tratando de encontrar una manera de convertir varias líneas de texto en un marco de datos . No estoy seguro de si hay alguna manera de poder usar read.delim() para leer en varias líneas de texto y crear el siguiente marco de datos con algo similar a rehape()?.convertir varias líneas de texto en un marco de datos

Los datos están estructurados de la siguiente manera:

A: 1 
B: 2 
C: 10 
A: 34 
B: 20 
C: 6.7 
A: 2 
B: 78 
C: 35 

me gustaría convertir estos datos a algo que se parece a la siguiente trama de datos:

A    B    C 
1    2    10 
34   20   6.7 
2    78   35 

Disculpas si hay una manera más obvia ¡para hacer esto!

Respuesta

9

¿Qué tal:

s<-"A: 1 
B: 2 
C: 10 
A: 34 
B: 20 
C: 6.7 
A: 2 
B: 78 
C: 35 
" 
d<-read.delim(textConnection(s),header=FALSE,sep=":",strip.white=TRUE) 
cols<-levels(d[,'V1']) 
d<-data.frame(sapply(cols,function(x) {d['V2'][d['V1']==x]}, USE.NAMES=TRUE)) 

que produce:

A B C 
1 1 2 10.0 
2 34 20 6.7 
3 2 78 35.0 
+0

. Ese fue un uso inteligente de 'sapply()'. No había pensado en usarlo de esa manera antes. – andrewj

+0

Gracias. Estoy empezando a aprender R, así que tuve que intentar usar las pocas herramientas a mi disposición. :) Acabo de notar su solución usando 'unstack'. Esa parece la mejor manera para mí. – unutbu

+0

Me pareció útil porque necesitaba convertir una cadena de texto '" a; lorem \ nb; ipsum \ nc; gecko "' en un data.frame y funcionó con la función 'textConnection()' que no sabía . – schlusie

0

Aquí es una solución utilizando remodelar

s<-"A: 1 
B: 2 
C: 10 
A: 34 
B: 20 
C: 6.7 
A: 2 
B: 78 
C: 35 
" 
d<-d<-read.delim(textConnection(s),header=FALSE,sep=":",strip.white=TRUE) 
N<-nrow(d)%/%3 
d$id<-rep(1:N,each=3) 
reshape(d,dir="wide",timevar="V1",idvar="id") 

que produce

id V2.A V2.B V2.C 
1 1 1 2 10.0 
4 2 34 20 6.7 
7 3 2 78 35.0 
4

Aquí es cómo hacerlo con el paquete plyr:

require("plyr") 
my.data <- "A: 1 
      B: 2 
      C: 10 
      A: 34 
      B: 20 
      C: 6.7 
      A: 2 
      B: 78 
      C: 35" 
df <- read.delim(textConnection(my.data),header=FALSE,sep=":",strip.white=TRUE) 

as.data.frame(dlply(df,.(V1),function(x) x[[2]])) 

Usted recibe

A B C 
1 1 2 10.0 
2 34 20 6.7 
3 2 78 35.0 

se puede ver lo plyr magia está haciendo sólo por jugar con dlply(df,.(V1)) o dlply(df,.(V1),function(x) x)

+0

Gracias por la sugerencia 'plyr'. Definitivamente vale la pena explorar más. Encontré una alternativa para resolver mi pregunta usando 'unstack' – andrewj

+0

Ah, buena llamada; en este caso, ese es probablemente el camino a seguir. plyr puede ser bastante útil, sin embargo, para otras operaciones de tipo "agrupar por". Si desea explorar más a fondo, puede leer http://had.co.nz/plyr/plyr-intro-090510.pdf –

2

he publicado esta pregunta en I-ayuda y recibió una respuesta de Phil Spector sugiriendo unstack.

Ésta es una modificación de la respuesta de Leo Alekseyev-

my.data <- "A: 1 
      B: 2 
      C: 10 
      A: 34 
      B: 20 
      C: 6.7 
      A: 2 
      B: 78 
      C: 35" 
df <- read.delim(textConnection(my.data),header=FALSE,sep=":",strip.white=TRUE) 
unstack(df, V2 ~ V1) 

Esto se traduce en:

A B C 
1 1 2 10.0 
2 34 20 6.7 
3 2 78 35.0 

Algunas de las ventajas de este enfoque en comparación con las otras respuestas reflexivas es que no es necesario especificar el número de columnas antes de tiempo. Tampoco requiere ningún paquete adicional.

Cuestiones relacionadas