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 <[email protected]> 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
> [email protected]
> https://stat.ethz.ch/mailman/listinfo/r-help-es
>
--
Saludos,
Carlos Ortega
www.qualityexcellence.es
[[alternative HTML version deleted]]
_______________________________________________
R-help-es mailing list
[email protected]
https://stat.ethz.ch/mailman/listinfo/r-help-es