[R-es] Error en loop anidado con data.table
Carlos Ortega
cof en qualityexcellence.es
Vie Ene 20 15:12:45 CET 2017
Hola,
Por entender el problema:
id anio t_8a t_10a t_12a rankf8 rankf10 rankf12
1 1 100 220 220 *1* *1 1*
2 1 140 350 350 2 3 3
3 2 55 165 165 1 1 1
4 2 60 200 200 2 2 2
5 2 100 NA NA 3 4 4
6 3 NA 350 350 NA 2 2
- Entiendo bien que el "1" de rankf8 (en negrita negro) corresponde al
100 de t_8a que está en la primera fila de t_8a de la matriz pequeña
- ¿Pero el "1" de rankf10 (negrita rojo) ?. La primera fila de t_10a en
la matriz pequeña no es un 220 si no un 200.
- Y algo parecido para el "1" de rankf12 (negrita azul). Hay que buscar
un 220 en t_12a de la matriz pequeña... ¡Y no está en la primera fila!...
-------Matriz Pequeña-----
t_8a t_10a t_12a
1 100 200 200
2 50 150 150
3 NA 250 250
Con estas dudas no termino de entender la lógica a aplicar.
Gracias,
Carlos Ortega
www.qualityexcellence.es
El 19 de enero de 2017, 21:29, Rodrigo López Correa <rod99hare en gmail.com>
escribió:
> Hola tengo una tabla de tipo data.frame "datos" con la siguiente
> estructura, simplificada en número de niveles por variable, para crear un
> ejemplo más sencillo:
>
> id anio t_8a t_10a t_12a rankf8 rankf10 rankf12
> 1 1 100 220 220 NA NA NA
> 2 1 140 350 350 NA NA NA
> 3 2 55 165 165 NA NA NA
> 4 2 60 200 200 NA NA NA
> 5 2 100 NA NA NA NA NA
> 6 3 NA 350 350 NA NA NA
>
> También tengo una matriz, "mat" con la siguiente estructura:
>
> t_8a t_10a t_12a
> 1 100 200 200
> 2 50 150 150
> 3 NA 250 250
>
>
>
> La columna rankf8 la quiero rellenar tomando como referencia valores de
> t_8a en "datos" en relación al valor de t_8a en la matriz "mat" y según el
> año que le corresponda (1, 2 o 3).
>
> Del mismo modo quiero rellenar los valores de rankf10 y rankf12 pero
> tomando como referencia valores de t_10a en "datos" en relación al valor de
> t_10a en la matriz "mat" y valores de t_12a en "datos" en relación al valor
> de t_12a en la matriz "mat, y según el año que le corresponda (1, 2 o 3).
>
> *Mi objetivo es que quede la tabla "datos" con las columnas rankf8, rankf10
> y rankf12 completas según la condición del script:*
>
> id anio t_8a t_10a t_12a rankf8 rankf10 rankf12
> 1 1 100 220 220 1 1 1
> 2 1 140 350 350 2 3 3
> 3 2 55 165 165 1 1 1
> 4 2 60 200 200 2 2 2
> 5 2 100 NA NA 3 4 4
> 6 3 NA 350 350 NA 2 2
>
>
>
> *Mi script es el siguiente:*
>
> datos<-data.frame(cbind(id,anireg_cod,t_8a,t_10a,t_12a,
> rankf8,rankf10,rankf12))
>
> datos<-data.table((datos),key="anireg_cod")
>
> datos[order(anireg_cod,decreasing=FALSE),]
>
> anio<-sort((unique(datos$anireg_cod)))
>
> tiempo<-as.character(c("t_8a","t_10a","t_12a"))
>
>
> mat<-matrix(c(100,50,NA,200,150,250,200,150,250),3,3)
> colnames(mat)<-tiempo
> rownames(mat)<-seq(1:length(sort(unique(datos$anireg_cod))))
>
> anio<-sort((unique(datos$anireg_cod)))
>
>
> rank<-as.character(c("rankf8","rankf10","rankf12"))
>
> for (k in 1:nrow(datos)){
>
> #recorre variable anio
>
> for (i in anio){
>
> for(j in tiempo){
>
> for(l in rank){
>
> ifelse(i==datos$anireg_cod & j %in% colnames(datos) &
> (datos[k,l==colnames(datos)]
>
> <=mat[i==rownames(mat)
> ,j==colnames(mat)]*0.1 +
> mat[i==rownames(mat),j==colnames(mat)]),
> datos[k,l %in% colnames(datos)]<-1,
>
> ifelse(i==datos$anireg_cod & j %in% colnames(datos) &
> (datos[k,l %in% colnames(datos)]>
> mat[i==rownames(mat),j==colnames(mat)]*0.1 +
> mat[i==rownames(mat),j==colnames(mat)] &
> (i==datos$anireg_cod & j %in% colnames(datos) & (datos[k,l %in%
> colnames(datos)])))<=
>
> mat[i==rownames(mat), j==colnames(mat)]*0.5 + mat[i==rownames(mat),
> j==colnames(mat)],
> datos[k,l %in% colnames(datos)]<-2,
>
> ifelse(i==datos$anireg_cod & j %in% colnames(datos) &
> (datos[k,l %in% colnames(datos)] & !is.na(datos[k,l %in% colnames(datos)])
> >
>
> mat[i==rownames(mat),j==colnames(mat)]*0.5),
> datos[k,l %in% colnames(datos)] <-3, 4)))
> }
> }
>
> }
>
>
> }
>
>
> *El error que se genera es:*
>
> Error in `[<-.data.table`(`*tmp*`, k, l %in% colnames(datos), value = 1) :
>
> j must be vector of column name or positions
>
>
>
> In addition: Warning message:
>
> In i == datos$anireg_cod & j %in% colnames(datos) & (datos[k, l == :
>
> longer object length is not a multiple of shorter object length
>
>
>
> Muchas gracias y disculpas si quedó muy largo pero quería explicitar eel
> problema lo mejor posible.
>
>
>
> Saludos,
>
> Rodrigo.
>
>
>
>
> --
> *Dr. Rodrigo López Correa.*
>
> Montevideo.
> Uruguay.
> Cel: 099 660 549.
>
> [[alternative HTML version deleted]]
>
> _______________________________________________
> R-help-es mailing list
> R-help-es en r-project.org
> https://stat.ethz.ch/mailman/listinfo/r-help-es
>
--
Saludos,
Carlos Ortega
www.qualityexcellence.es
[[alternative HTML version deleted]]
Más información sobre la lista de distribución R-help-es