[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