Tengo un marco de datos en R, que tiene un número de filas (más de 3000) con F0 (frecuencia fundamental) de las pistas de una expresión en ella. Las filas tienen la siguiente información: IDENTIFICACIÓN de locutor, número de grupo, la repetición #, acento tipo, el sexo y el 50 columnas de F0 puntos. Los datos se parece a esto:

Speaker Sex Group Repetition Accent    Word         1         2         3        4
    105   M     1          1      N AILMENT 102.31030 102.31030 102.31030 102.31127 
    105   M     1          1      N COLLEGE 111.80641 111.80313 111.68612 111.36020
    105   M     1          1      N  FATHER 124.06655 124.06655 124.06655 124.06655 

Pero en lugar de sólo va a X4, tiene 50 puntos por fila, así que tengo un 3562×56 marco de datos. Quiero cambiarlo para cada columna de datos de la F0 de la pista (así que después de la palabra, de la 1:50) obtiene su propia columna, con los asociados de número de columna como la otra fila. Quiero mantener toda la información en los primeros seis columnas con los datos de cada punto, así que tendría este aspecto:

Speaker Sex Group Repetition Accent    Word       Num        F0
    105   M     1          1      N AILMENT         1 102.31030
    105   M     1          1      N AILMENT         2 102.31030
    105   M     1          1      N AILMENT         3 102.31030
    105   M     1          1      N AILMENT         4 102.31127
    ...
    105   M     1          1      N COLLEGE         1 111.80641 
    105   M     1          1      N COLLEGE         1 111.80313 
    105   M     1          1      N COLLEGE         1 111.68612 
    105   M     1          1      N COLLEGE         1 111.36020 
    ...

El código traté de usar, aunque tedioso, es como sigue:

x = 1
for (i in 1:dim(normrangef0)[1]) {
     for (j in 1:50) {
             norm.all$Speaker[x] <- normrangef0$Speaker[i]
             norm.all$Sex[x] <- normrangef0$Sex[i]
             norm.all$Group[x] <- normrangef0$Group[i]
             norm.all$Repetition[x] <- normrangef0$Repetition[i]
             norm.all$Word[x] <- normrangef0$Word[i]
             norm.all$Accent[x] <- normrangef0$Accent[i]
             norm.all$Time[x] <- j
             norm.all$F0[x] <- normrangef0[i,j+6]
             x = x+1    
    }
}

Sin embargo, cuando hago esto con la norma.todo como un objeto NULO (se define solamente por la norma.todos = c() ), que terminan con una lista de más de 200 artículos, muchos de los cuales son NAs. Cuando defino la norma.todos como un marco de datos (ya sea vacío o a uno de todos los 0s, en el 178100×8 marco de datos, me sale un error:

Error en $<-.data.frame(*tmp*, «Altavoz», » valor = 105L) : reemplazo tiene 1 fila de datos, tiene 0

Es mi código totalmente fuera? Hay otra manera de hacer esto?

  • ¿qué idioma se debe de ser esto? C?
  • Lo siento mucho! Es en R.
InformationsquelleAutor Marissa | 2013-12-09

2 Comentarios

  1. 9

    Uso melt de «reshape2»

    library(reshape2)
    melt(mydf, id.vars=c("Speaker", "Sex", "Group", "Repetition", "Accent", "Word"))
    #    Speaker Sex Group Repetition Accent    Word variable    value
    # 1      105   M     1          1      N AILMENT        1 102.3103
    # 2      105   M     1          1      N COLLEGE        1 111.8064
    # 3      105   M     1          1      N  FATHER        1 124.0666
    # 4      105   M     1          1      N AILMENT        2 102.3103
    # 5      105   M     1          1      N COLLEGE        2 111.8031
    # 6      105   M     1          1      N  FATHER        2 124.0666
    # 7      105   M     1          1      N AILMENT        3 102.3103
    # 8      105   M     1          1      N COLLEGE        3 111.6861
    # 9      105   M     1          1      N  FATHER        3 124.0666
    # 10     105   M     1          1      N AILMENT        4 102.3113
    # 11     105   M     1          1      N COLLEGE        4 111.3602
    # 12     105   M     1          1      N  FATHER        4 124.0666

    En base R, también se puede utilizar stack a la pila de las columnas nombre de la 1 a la 4, y cbind que con el primer grupo de columnas. Alternativamente, unlist también va a hacer esto.


    También puede que desee ver en los datos».tabla» paquete para obtener un poco de un impulso de velocidad.

    • ¿Qué significa este mensaje de indicar? Warning message: attributes are not identical across measure variables; they will be dropped . He comprobado mis resultados y se ven bien, pero quisiera confirmar el significado de la advertencia.
    • aceptar los datos no se ve bien. Me estoy perdiendo información en los datos resultantes.marco. en lugar de recoger todos los valores de la variable, estoy recibiendo sólo el primer valor de cada fila!
    • la advertencia es por lo general cuando usted fusión de columnas de diferentes tipos (numérico, entero juntos, por ejemplo, o el carácter y el factor juntos). No estoy seguro de cómo interpretar su segundo comentario sin algunos datos de ejemplo para trabajar con.
    • Voy a publicar como una pregunta. Me hizo tratar de convertir a todos de medir variables a la misma clase pero no funcionó – el mismo mensaje de advertencia. Publicaremos la pregunta.
  2. 3

    Con reshape:

    x <- read.table(header=T, text="Speaker Sex Group Repetition Accent    Word         1         2         3        4
    105   M     1          1      N AILMENT 102.31030 102.31030 102.31030 102.31127
    105   M     1          1      N COLLEGE 111.80641 111.80313 111.68612 111.36020
    105   M     1          1      N  FATHER 124.06655 124.06655 124.06655 124.06655")
    
    reshape(x, direction="long", sep='', varying=paste0('X', 1:4))
    ##     Speaker Sex Group Repetition Accent    Word time        X id
    ## 1.1     105   M     1          1      N AILMENT    1 102.3103  1
    ## 2.1     105   M     1          1      N COLLEGE    1 111.8064  2
    ## 3.1     105   M     1          1      N  FATHER    1 124.0666  3
    ## 1.2     105   M     1          1      N AILMENT    2 102.3103  1
    ## 2.2     105   M     1          1      N COLLEGE    2 111.8031  2
    ## 3.2     105   M     1          1      N  FATHER    2 124.0666  3
    ## 1.3     105   M     1          1      N AILMENT    3 102.3103  1
    ## 2.3     105   M     1          1      N COLLEGE    3 111.6861  2
    ## 3.3     105   M     1          1      N  FATHER    3 124.0666  3
    ## 1.4     105   M     1          1      N AILMENT    4 102.3113  1
    ## 2.4     105   M     1          1      N COLLEGE    4 111.3602  2
    ## 3.4     105   M     1          1      N  FATHER    4 124.0666  3
    • +1 para la base (la que yo uso normalmente, irónicamente).

Dejar respuesta

Please enter your comment!
Please enter your name here