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 № 1Una 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