Me gustaría identificar y marcar filas duplicadas basadas en 2 columnas. Me gustaría hacer un identificador único para cada duplicado, así que sé no solo que la fila es un duplicado, sino con qué fila es un duplicado. Tengo un marco de datos que se ve a continuación con algunos pares de elementos duplicados (en forma y sentado) y otros pares que no están duplicados. Si bien los pares de elementos están duplicados, la información que contienen es única (por ejemplo, una fila tendrá un valor en Value1 para 1 fila, pero no Value2 y Value 3, la segunda fila o 'duplicado' tendrá números para Value2 y Value3 solo no valor1)
marco de datos actual
value1 value2 value3 fit sit
[1,] "1" NA NA "it1" "it2"
[2,] NA "3" "2" "it2" "it1"
[3,] "2" "3" "4" "it3" "it4"
[4,] NA NA NA "it4" "it3"
[5,] "5" NA NA "it5" "it6"
[6,] NA NA "2" "it6" "it5"
[7,] NA "4" NA "it7" "it9"
código para generar un marco de datos de ejemplo
value1<-c(1,NA,2,NA,5,NA,NA)
value2<-c(NA,3,3,NA,NA,NA, 4)
value3<-c(NA,2,4,NA,NA,2, NA)
fit<-c("it1","it2","it3","it4", "it5", "it6","it7")
sit<-c("it2","it1","it4","it3", "it6", "it5", "it9")
df.now<-cbind(value1,value2,value3, fit, sit)
lo que quiero es convertirlo a un marco de datos que se vea así:
marco de datos deseado
val1 val2 val3 it1 it2
[1,] "1" "3" "2" "it1" "it2"
[2,] "2" "3" "4" "it3" "it4"
[3,] "5" NA "2" "it5" "it6"
[4,] NA "4" NA "it7" "it9"
Estaba pensando en seguir los siguientes pasos: 1. crear nuevas variables usando fit y sentarse con el elemento más bajo y los elementos más altos para identificar pares duplicados 2. identificar pares de elementos duplicados 3. usar ifelse para seleccionar y completar información única.
Sé cómo hacer los pasos 1 y 3, pero estoy atascado en el paso 2. Creo que lo que tengo que hacer no es solo identificar el duplicado VERDADERO / FALSO, sino quizás tener una columna con un identificador único para cada par de elementos como este (hay son 2 filas adicionales debido a mi paso 1):
value1 value2 value3 fit sit lit hit dup
[1,] "1" NA NA "it1" "it2" "it1" "it2" 1
[2,] NA "3" "2" "it2" "it1" "it1" "it2" 1
[3,] "2" "3" "4" "it3" "it4" "it3" "it4" 2
[4,] NA NA NA "it4" "it3" "it3" "it4" 2
[5,] "5" NA NA "it5" "it6" "it5" "it6" 3
[6,] NA NA "2" "it6" "it5" "it5" "it6" 3
[7,] NA "4" NA "it7" "it9" "it7" "it9" NA
No estoy seguro de cómo hacer esto.
Lo que estoy pidiendo es ayuda con el paso 2 o tal vez hay una mejor manera de resolverlo que los pasos que describí.
Usar
!duplicated()
después desort
ing.fuente
Usando
melt/dcast
desdedata.table
datos
fuente
Otra
data.table
opcion:salida:
fuente
Aquí está mi intento de usar data.table. Se llaman sus datos
mydf
. En primer lugar, me lo solucionaronfit
ysit
para cada fila y ha creado una nueva variable,group
. Luego, para cada grupo, clasifiqué los valores en las tres columnas de valores (es decir, valor1, valor2 y valor3). Finalmente, extraje la primera fila para cada grupo.DATOS
fuente
Esto también se puede hacer usando
tidyr
'spivot_longer
convalues_drop_na = TRUE
combinado conpivot_wider
:Datos
fuente