[R-es] Error en loop anidado con data.table

Rodrigo López Correa rod99hare en gmail.com
Jue Ene 19 21:29:56 CET 2017


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]]



Más información sobre la lista de distribución R-help-es