Skip to content

[R-es] Completar un for, que falla al faltarle algún dato.

4 messages · Carlos Ortega, Javier Marcuzzi, Juan Abasolo

#
Buenas noches;
Además del proyecto que comenté antes y con el que sigo discutiendo,
también me estoy peleando con otro... con el que también tropiezo.

Necesito reordenar los datos presentados en dos columnas a filas y
columnas.

Los datos ideales serían algo así:

Ques <- c(rep("Q1",3),rep("Q2",3),rep("Q3",3))
Info <- rep(c("aca", "ahi", "alla"),3)
Answ <- c("casa", "bulo", "hogar", "mama", "mami", "vieja", "perro", "can",
"rope")

df.raw <- data.frame(ID, Ques, Info, Answ)


Pero, como no son ideales, se parecen a esto:

df.raw1 <- df.raw[-2,]

# Necesito un dataframe con una estructura así:

df.ok <- data.frame(matrix(ncol = length(levels(df.raw$Ques)), nrow =
length(levels(df.raw$Info))))

names(df.ok) <- levels(df.raw$Ques)
rownames(df.ok) <- levels(df.raw$Info)

# que incluya los datos de 'Answ' en donde correspondería

J <- levels(df.raw$Ques)
K <- levels(df.raw$Info)

# El ideal me queda resuelto con esto:

for (j in J){
        sdf <- subset(df.raw, df.raw$Ques==j)
        for(k in K){
                x <- sdf[which(sdf$Info==k), "Answ"]
                df.ok[k,j] <- as.character(x)
        }
}

Pero si en la segunda linea sustituyo df.raw por df.raw1

for (j in J){
        sdf <- subset(df.raw1, df.raw1$Ques==j)
        for(k in K){
                x <- sdf[which(sdf$Info==k), "Answ"]
                df.ok[k,j] <- as.character(x)
        }
}

, ahí me da error.

¿Hay alguna forma de que asigne "" o NA o algo a quitar luego? O packete
que haga el trabajo u orden para salvar lo que venía haciendo yo?

Presupongo que será otra de esas respuestas evidentes, y disculpen lo largo
de la exposición.

Desde ya, muchas gracias
#
Hola,

Aparece un problema porque en en el primer subset (sdf) hay algunos valores
de K que no existen.
Una forma de "protegerse" es esta, incluyendo un "NA" cuando eso ocurre...



for (j in J){
  print(j)
  sdf <- subset(df.raw1, df.raw1$Ques==j)
  for(k in K){
    print(k)
    x <- sdf[which(sdf$Info==k), "Answ"]


* if(length(x) == 0) {       df.ok[k, j ] <- "NA"    } else { df.ok[k,j] <-
as.character(x) }*
  }
}

Saludos,
Carlos Ortega
www.qualityexcellence.es

El 8 de julio de 2018, 0:25, Juan Abasolo <juan.abasolo en ehu.eus> escribió:

  
    
#
Estimado Juan Abasolo

Creo que no es problema de R, es de su lógica porque se confundió al
explicarnos, le explico en sus datos:

Si realizo en mi computadora escribo lo siguiente a partir de su código:
 for (j in J){
    sdf <- subset(df.raw, df.raw$Ques==j)
    for(k in K){
      x <- sdf[which(sdf$Info==k), "Answ"]
      df.ok[k,j] <- as.character(x)
    }
  }

  for (j in J){
    sdf <- subset(df.raw1, df.raw1$Ques==j)
    for(k in K){
      x <- sdf[which(sdf$Info==k), "Answ"]
      df.ok[k,j] <- as.character(x)
    }
  }

Obtengo estos resultados:

df.raw  Ques Info  Answ
1   Q1  aca  casa
2   Q1  ahi  bulo
3   Q1 alla hogar
4   Q2  aca  mama
5   Q2  ahi  mami
6   Q2 alla vieja
7   Q3  aca perro
8   Q3  ahi   can
9   Q3 alla  rope> df.raw1  Ques Info  Answ
1   Q1  aca  casa
3   Q1 alla hogar
4   Q2  aca  mama
5   Q2  ahi  mami
6   Q2 alla vieja
7   Q3  aca perro
8   Q3  ahi   can
9   Q3 alla  rope


Ahora observe en df.raw1, en el "indice 2", no lo encontrará porque pasa de
1 a 3, usted al querer explicarnos su problema ha eliminado el valor al
ordenar
df.raw1 <- df.raw[-2,]

La ayuda de Carlos Ortega es correcta, pero posiblemente si los datos son
reales y no inventados en código como en su ejemplo, ese error lógico no
aparece porque serían NA.

Javier Rubén Marcuzzi

El sáb., 7 jul. 2018 a las 20:54, Carlos Ortega (<cof en qualityexcellence.es>)
escribió:

  
  
#
Muchas gracias, Carlos y Javier.
La solución a como yo estaba entendiendo el problema es la que me dió
Carlos. Me queda ahora por resolver alguna cuestión de valores dobles que
encuentro en mi data.frame de verdad. Pero ya estoy bien cerquita!

Muchas gRacias!

2018-07-08 1:54 GMT+02:00 Carlos Ortega <cof en qualityexcellence.es>: