/ / Eliminar filas semi duplicadas en R - r

Eliminar filas semi duplicadas en R - r

Tengo el siguiente data.frame.

a <- c(rep("A", 3), rep("B", 3), rep("C",2), "D")
b <- c(NA,1,2,4,1,NA,2,NA,NA)
c <- c(1,1,2,4,1,1,2,2,2)
d <- c(1,2,3,4,5,6,7,8,9)
df <-data.frame(a,b,c,d)


a  b c d
1 A NA 1 1
2 A  1 1 2
3 A  2 2 3
4 B  4 4 4
5 B  1 1 5
6 B NA 1 6
7 C  2 2 7
8 C NA 2 8
9 D NA 2 9

Quiero eliminar las filas duplicadas (basadas en las columnas A y C) para que la fila con los valores en la columna B se guarden. En este ejemplo, las filas 1, 6 y 8 se eliminan.

Respuestas

1 para la respuesta № 1

Una forma de hacer esto es order por "a", "b" y el vector lógico basado en "b" para que todos los elementos "NA" sean los últimos para cada grupo de "a" y "b". Luego, aplica el duplicated y mantener solo los elementos no duplicados

df1 <- df[order(df$a, df$b, is.na(df$b)),]
df2 <- df1[!duplicated(df1[c("a", "c")]),]
df2
#  a  b c d
#2 A  1 1 2
#3 A  2 2 3
#5 B  1 1 5
#4 B  4 4 4
#7 C  2 2 7
#9 D NA 2 9

setdiff(seq_len(nrow(df)), row.names(df2) )
#[1] 1 6 8

1 para la respuesta № 2

Primero cree dos conjuntos de datos, uno con duplicados en la columna a y otro sin duplicados en la columna a usando la función siguiente:

x = df[df$a %in% names(which(table(df$a) > 1)), ]
x1 = df[df$a %in% names(which(table(df$a) ==1)), ]

Ahora usa la función na.omit en el conjunto de datos x para eliminar las filas con NA y luego rbind x y x1 para el conjunto de datos final.

rbind(na.omit(x),x1)

Responder:

   a  b c d

2  A  1 1 2

3  A  2 2 3

4  B  4 4 4

5  B  1 1 5

7  C  2 2 7

9  D NA 2 9

0 para la respuesta № 3

Puedes usar dplyr para hacer esto.

df %>% distinct(a, c,  .keep_all = TRUE)
  a  b c d
1 A NA 1 1
2 A  2 2 3
3 B  4 4 4
4 B  1 1 5
5 C  2 2 7
6 D NA 2 9

Hay otras opciones en dplyr, mira esta pregunta para más detalles: Eliminar filas duplicadas utilizando dplyr