tablas seleccionar repetidos nulos identificar filas eliminar duplicated duplicados duplicadas datos contar columnas r duplicates

repetidos - seleccionar datos en r



Eliminar duplicados, pero mantener la iteración más completa (2)

Estoy tratando de averiguar cómo eliminar duplicados en función de tres variables ( id, key, and num ). Me gustaría eliminar el duplicado con la menor cantidad de columnas llenas. Si se llena un número igual, cualquiera puede ser eliminado. Por ejemplo,

Original <- data.frame(id= c(1,2,2,3,3,4,5,5), key=c(1,2,2,3,3,4,5,5), num=c(1,1,1,1,1,1,1,1), v4= c(1,NA,5,5,NA,5,NA,7), v5=c(1,NA,5,5,NA,5,NA,7))

El resultado sería el siguiente:

Finished <- data.frame(id= c(1,2,3,4,5), key=c(1,2,3,4,5), num=c(1,1,1,1,1), v4= c(1,5,5,5,7), v5=c(1,5,5,5,7))

Mi conjunto de datos real es más grande y una mezcla de variables principalmente numéricas, pero algunas de carácter, pero no pude determinar la mejor manera de hacerlo. Anteriormente utilicé un programa que haría algo similar dentro del comando duplicado llamado check.all.

Hasta ahora, mis pensamientos han sido usar grepl y determinar dónde está presente "cualquier cosa"

Present <- apply(Original, 2, function(x) grepl("[[:alnum:]]", x))

Luego, usando el dataframe resultante, pido rowSums y Cbind al original.

CompleteNess <- rowSums(Present) cbind(Original, CompleteNess)

Este es el punto en el que no estoy seguro de mis próximos pasos ... Tengo una variable que me dice cuántas columnas se rellenan en cada fila (CompleteNess); sin embargo, no estoy seguro de cómo implementar duplicados.

Simplemente, estoy buscando Cuando id, key y num están duplicados, mantenga la fila con el valor más alto de CompleteNess.

Si alguien puede pensar en una mejor manera de hacer esto o superar el último poco, lo agradecería enormemente. ¡Gracias a todos!


Aquí hay una solución. No es muy bonito, pero debería funcionar para su aplicación:

#Order by the degree of completeness Original<-Original[order(CompleteNess),] #Starting from the bottom select the not duplicated rows #based on the first 3 columns Original[!duplicated(Original[,1:3], fromLast = TRUE),]

Esto reorganiza el marco de datos original, así que ten cuidado si hay un procesamiento adicional más adelante.


Puede agregar sus datos y seleccionar la fila con puntaje máximo:

Original <- data.frame(id= c(1,2,2,3,3,4,5,5), key=c(1,2,2,3,3,4,5,5), num=c(1,1,1,1,1,1,1,1), v4= c(1,NA,5,5,NA,5,NA,7), v5=c(1,NA,5,5,NA,5,NA,7)) Present <- apply(Original, 2, function(x) grepl("[[:alnum:]]", x)) #get the score Original$present <- rowSums(Present) #create a column to aggregate on Original$id.key.num <- paste(Original$id, Original$key, Original$num, sep = "-") library("plyr") #aggregate here Final <- ddply(Original,.(id.key.num),summarize, Max = max(present))

Y si quieres mantener las otras columnas, solo haz esto:

Final <- ddply(Original,.(id.key.num),summarize, Max = max(present), v4 = v4[which.max(present)], v5 = v5[which.max(present)] )