[R-es] Corregir mismo ID para individuos diferentes en una serie temporal

Carlos Ortega cof en qualityexcellence.es
Mar Ene 26 12:55:55 CET 2016


Hola,

Please, mira si esta vez funciona:

#----------------------------------------------
ID <- c(1, 2, 3, 4, 5, 6, 7, 1, 2, 3, 8, 9, 10, 11, 12, 1, 2, 3, 4, 5, 6,
1, 2, 6, 8, 12, 7, 15, 16, 17, 18, 19, 20, 1, 21, 22, 19 )
Year <- c (1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3,
4, 4, 4, 4, 4, 5, 5, 5, 5, 5, 5, 5, 5, 6, 6, 6)
df <- data.frame (ID, Year)
df

ID <- c(1, 2, 3, 4, 5, 6, 7, 1, 2, 3, 8, 9, 10, 11, 12, 1, 2, 3, 4, 5, 6,
1, 2, 6, 8, 12, 7, 15, 16, 17, 18, 19, 20, 1, 21, 22, 19 )
Year <- c (1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3,
4, 4, 4, 4, 4, 5, 5, 5, 5, 5, 5, 5, 1, 6, 6, 6)
new_ID <- c("A", "B", "C", "D", "E", "F", "G", "A", "B", "C", "H", "I",
"J", "K", "L", "M", "N", "O", "P", "Q", "R", "M", "N", "Q", "S", "L", "T",
"U", "V", "W", "X", "Y", "Z", "CC", "AA", "BB", "Y")
ref_df <- data.frame (ID, Year, new_ID)
ref_df

rep_val <- rep(0, nrow(df))
new_df <- data.frame(ID=rep_val, Year=rep_val, newID=rep_val,
hmyears=rep_val)
for(i in 1:nrow(df)) { #Cero
  print(i)
  if(i==1) {
    new_df$ID[i] <- df$ID[i]
    new_df$Year[i] <- df$Year[i]
    new_df$newID[i] <- df$ID[i]
    new_df$hmyears[i] <- 1
  } else {                                #Uno
    coin <- which(df$ID[i]==df$ID[1:(i-1)])
    print(coin)
    if(length(coin) < 1 ) {
      new_df$ID[i] <- df$ID[i]
      new_df$Year[i] <- df$Year[i]
      if(length(which(df$ID[i]==new_df$newID)) < 1) {new_df$newID[i] <-
df$ID[i]} else {new_df$newID[i] <- max(new_df$newID)+1}
      new_df$hmyears[i] <- 1
    } else {                              #Dos
      if( (new_df$hmyears[max(coin)] < 2) & (df$Year[i] -
df$Year[max(coin)]) < 2 ) {
        new_df$ID[i] <- df$ID[i]
        new_df$Year[i] <- df$Year[i]
        new_df$newID[i] <- new_df$newID[max(coin)]
        new_df$hmyears[i] <- new_df$hmyears[max(coin)] + 1
      } else {                            #Tres
        new_df$ID[i] <- df$ID[i]
        new_df$Year[i] <- df$Year[i]
        new_df$newID[i] <- max(new_df$newID) + 1
        new_df$hmyears[i] <- 1
      } #Tres
    } #Dos
  } #Uno
} #Cero
new_df

#----------------------------------------------






El 26 de enero de 2016, 12:17, Carlos Ortega <cof en qualityexcellence.es>
escribió:

> Hola,
>
> Cierto. No había tenido en cuenta que los años donde se registra un
> individuo pueden no ser consecutivos.
> Ahora que creo que entiendo la dinámica, veo como incluir esta condición
> en el código cuando ya existe una entrada previa del individuo para que
> incremente su ID.
>
> Gracias,
> Carlos.
>
> El 26 de enero de 2016, 12:04, Ruben Bermad <ruben_bm en hotmail.com>
> escribió:
>
>> Hola,
>>
>> Antes de nada, muchas gracias por tu ayuda.
>>
>> El código se ha acercado bastante, pero no termina de funcionar
>> porque considera cada captura de un individuo como años consecutivos aunque
>> haya pasado más tiempo entre ellos.
>>
>> Por ejemplo el individuo 4 es capturado por primera vez el año 1 y por
>> segunda vez el año 3, por lo que debería de ser renombrado ya que en este
>> ejemplo en concreto asumimos que la vida maxima son 2 años desde su primera
>> aparición. Pero el script considera que es el mismo individuo porque es la
>> segunda vez un individuo con ese nombre es capturado, sin tener en cuenta
>> el tiempo que ha pasado entre la segunda captura y la primera.
>>
>> Yo habia pensado en salvar en una columna el tiempo de la primera
>> aparicion y cada vez que aparezca un individuo con el mismo nombre restarle
>> el tiempo del que aparecio por primera vez con ese nombre. De esa manera
>> queda registrado el tiempo que ha pasado entre ambas apariciones, y si es
>> superior al tiempo que consideramos imposible habria que renombrarlo.
>>
>> Lo que no se hacer es como repetir el proceso las veces necesarias,
>> suponiendo que puede haber un tercer individuo con el mismo nombre (e.g. el
>> individuo 1 en el año 5 que coge como referencia la primera aparicion del
>> individuo 1 renombrado como individuo 13).
>>
>> Muchas gracias.
>> Un cordial saludo,
>> Rubén
>>
>>
>> ------------------------------
>> Date: Mon, 25 Jan 2016 23:09:13 +0100
>> Subject: Re: [R-es] Corregir mismo ID para individuos diferentes en una
>> serie temporal
>> From: cof en qualityexcellence.es
>> To: ruben_bm en hotmail.com
>> CC: r-help-es en r-project.org
>>
>>
>> Hola,
>>
>> Creo que el código que te adjunto hace lo que pides.
>> Los nuevos ids los he generado con números no con letras, me resulta más
>> fácil tratar el problema así.
>>
>>
>> #----------------------
>> ID <- c(1, 2, 3, 4, 5, 6, 7, 1, 2, 3, 8, 9, 10, 11, 12, 1, 2, 3, 4, 5, 6,
>> 1, 2, 6, 8, 12, 7, 15, 16, 17, 18, 19, 20, 1, 21, 22, 19 )
>> Year <- c (1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3,
>> 4, 4, 4, 4, 4, 5, 5, 5, 5, 5, 5, 5, 5, 6, 6, 6)
>> df <- data.frame (ID, Year)
>> df
>>
>> ID <- c(1, 2, 3, 4, 5, 6, 7, 1, 2, 3, 8, 9, 10, 11, 12, 1, 2, 3, 4, 5, 6,
>> 1, 2, 6, 8, 12, 7, 15, 16, 17, 18, 19, 20, 1, 21, 22, 19 )
>> Year <- c (1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3,
>> 4, 4, 4, 4, 4, 5, 5, 5, 5, 5, 5, 5, 1, 6, 6, 6)
>> new_ID <- c("A", "B", "C", "D", "E", "F", "G", "A", "B", "C", "H", "I",
>> "J", "K", "L", "M", "N", "O", "P", "Q", "R", "M", "N", "Q", "S", "L", "T",
>> "U", "V", "W", "X", "Y", "Z", "CC", "AA", "BB", "Y")
>> ref_df <- data.frame (ID, Year, new_ID)
>> ref_df
>>
>> rep_val <- rep(0, nrow(df))
>> new_df <- data.frame(ID=rep_val, Year=rep_val, newID=rep_val,
>> hmyears=rep_val )
>> for(i in 1:nrow(df)) { #Cero
>>   if(i==1) {
>>     new_df$ID[i] <- df$ID[i]
>>     new_df$Year[i] <- df$Year[i]
>>     new_df$newID[i] <- df$ID[i]
>>     new_df$hmyears[i] <- 1
>>   } else {                                #Uno
>>     coin <- which(df$ID[i]==df$ID[1:(i-1)])
>>     print(coin)
>>     if(length(coin) < 1 ) {
>>       new_df$ID[i] <- df$ID[i]
>>       new_df$Year[i] <- df$Year[i]
>>       if(length(which(df$ID[i]==new_df$newID)) < 1) {new_df$newID[i] <-
>> df$ID[i]} else {new_df$newID[i] <- max(new_df$newID)+1}
>>       new_df$hmyears[i] <- 1
>>     } else {                              #Dos
>>       if( new_df$hmyears[max(coin)] < 2 ) {
>>         new_df$ID[i] <- df$ID[i]
>>         new_df$Year[i] <- df$Year[i]
>>         new_df$newID[i] <- new_df$newID[max(coin)]
>>         new_df$hmyears[i] <- new_df$hmyears[max(coin)] + 1
>>       } else {                            #Tres
>>         new_df$ID[i] <- df$ID[i]
>>         new_df$Year[i] <- df$Year[i]
>>         new_df$newID[i] <- max(new_df$newID) + 1
>>         new_df$hmyears[i] <- 1
>>       } #Tres
>>
>>     } #Dos
>>   } #Uno
>> } #Cero
>> new_df
>>
>> #----------------------
>>
>> Saludos,
>> Carlos Ortega
>> www.qualityexcellence.es
>>
>>
>> El 25 de enero de 2016, 18:11, Ruben Bermad <ruben_bm en hotmail.com>
>> escribió:
>>
>> Hola a todos,
>> Quería preguntar si alguno sabe como puedo identificar registros con un
>> mismo ID en el tiempo, pero que hacer referencia a objetos o individuos
>> diferentes.
>> En mi caso en particular estoy estudiando un animal que tiene una vida
>> media cercana 2 años, y tengo una serie longitudinal de 25 años. El
>> problema es que durante el muestreo en algunos casos durante la recoleccion
>> de los datos, se repitieron los nombres de los individuos porque se asumen
>> que si ha pasado 10 años no puede ser el mismo individuo. Y el problema que
>> yo tengo es que no se como detectar de manera automática este tipo de
>> errores.
>> Había pensado era en registrar la primera aparición de cada nombre (e.g
>> indiv_1, y ver el tiempo que ha pasado en comparación con el resto de
>> registros para ese mismo individuo, y en el caso que fuera superior (por
>> ejemplo a 36 meses para estar totalmente seguros), que ese individuo que
>> había sido registrado como "indiv_1" sea renombrado (e.g. indiv_150), y
>> cambiar todos los siguientes registros de indiv_1 a indiv_150.
>> Esto parece sencillo, pero lo complicado al revisar todos los casos
>> nombrados ahora como indiv_150 ya que es posible que el nombre indiv_1 haya
>> sido usado para varios individuos diferentes a lo largo de la serie (e.g.
>> en el año 1, 10 y 20). Entonces lo que había pensado es hacer un bucle para
>> cada individuo, pero no consigo que cada vez que cambia el nombre de un
>> individuo (e.g. en el año 10) capture la nueva fecha para determinar si los
>> siguientes nombres hacen referencia al mismo individuo u a otro muy
>> posterior en el tiempo (e.g. año 20).
>> Esta pregunta la pregunte hace tiempo en stackoverflowhttp://
>> stackoverflow.com/questions/32310520/identify-objects-with-repeated-measures-and-with-the-same-id-between-years,
>> pero no obtuve una respuesta que solucionara el problema, y los posteriores
>> intentos que he estado haciendo tampoco han sido muy buenos que se digan
>> (os lo copio al final del mensaje).
>> Por ello os quería preguntar si alguno sabe como puedo ir registrando y
>> cambiando los IDs a lo largo del tiempo.
>> Muchas gracias por adelantado, Un cordial saludo, Rubén
>> Codigo usadodatabase es la base de datos con la serie temporalID_original
>> es el identificado original que tiene cada individuoMonth_Capt es la
>> variable que me indica en que momento fue capturado cada individuo y por
>> tanto si es posible o no que el individuo sea el mismo a lo largo del
>> tiempo.
>> newID <-sapply(unique(database$ID_original), function(x)
>> c(0,cumsum(diff(database$Month_Capt[database$ID_original==x]))%%48))names(newID)<-(unique(database$ID_original))
>> new_df<-data.frame(database$ID_original,database$Month_Capt,IDcond=NA,new_ID=NA)for(i
>> in unique(database$ID_original)){
>> new_df[new_df[,1]==i,3]<-newID[[which(unique(database$ID_original)==i)]]}ltrs<-c(LETTERS,apply(combn(LETTERS,2,simplify
>> = T),2,function(x) paste(x,sep = "",collapse = "")))
>> letterwrap <- function(n, depth = 1) {  args <- lapply(1:depth, FUN =
>> function(x) return(LETTERS))  x <- do.call(expand.grid, args = list(args,
>> stringsAsFactors = F))  x <- x[, rev(names(x)), drop = F]  x <-
>> do.call(paste0, x)  if (n <= length(x)) return(x[1:n])  return(c(x,
>> letterwrap(n - length(x), depth = depth + 1)))}
>> ltrs <- letterwrap(nrow(database)) # Create as many letters as unique IDs
>>
>> ltrn<-0for(i in 1:nrow(new_df)){  if(new_df[i,3]==0)
>> {ltrn<-ltrn+1;new_df[i,4]<-ltrs[ltrn]}  else
>> {ind<-which(new_df[,1]==new_df[i,1])        ind<-ind[ind<i]
>> new_df[i,4]<-tail(new_df[ind,4],1)}}
>>
>>         [[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
>>
>
>
>
> --
> Saludos,
> Carlos Ortega
> www.qualityexcellence.es
>



-- 
Saludos,
Carlos Ortega
www.qualityexcellence.es

	[[alternative HTML version deleted]]



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