Tengo un dataframe con> 100 columnas, y me gustaría encontrar las filas únicas, al comparar solo dos de las columnas. Espero que sea fácil, pero no puedo hacer que funcione con mi duplicated
unique
o duplicated
.
En el siguiente, me gustaría que solo use id y id2:
data.frame(id=c(1,1,3),id2=c(1,1,4),somevalue=c("x","y","z")) id id2 somevalue 1 1 x 1 1 y 3 4 z
Me gustaría obtener:
id id2 somevalue 1 1 x 3 4 z
o:
id id2 somevalue 1 1 y 3 4 z
(No tengo preferencia cuál de las filas únicas se mantiene)
De acuerdo, si no importa qué valor en la columna no duplicada que seleccione, esto debería ser bastante fácil:
dat <- data.frame(id=c(1,1,3),id2=c(1,1,4),somevalue=c("x","y","z")) > dat[!duplicated(dat[,c('id','id2')]),] id id2 somevalue 1 1 1 x 3 3 4 z
Dentro de la llamada duplicated
, simplemente estoy pasando solo las columnas de dat
que no quiero duplicados. Este código siempre seleccionará automáticamente el primero de los valores ambiguos. (En este caso, x.)
Usando unique()
:
dat <- data.frame(id=c(1,1,3),id2=c(1,1,4),somevalue=c("x","y","z")) dat[row.names(unique(dat[,c("id", "id2")])),]
Aquí hay un par de opciones dplyr
que mantienen filas no duplicadas basadas en las columnas id e id2:
library(dplyr) df %>% distinct(id, id2, .keep_all = TRUE) df %>% group_by(id, id2) %>% filter(row_number() == 1) df %>% group_by(id, id2) %>% slice(1)
Actualización menor en el código de @ Joran.
Usando el siguiente código, puede evitar la ambigüedad y obtener solo el único de dos columnas:
dat <- data.frame(id=c(1,1,3), id2=c(1,1,4) ,somevalue=c("x","y","z")) dat[row.names(unique(dat[,c("id", "id2")])), c("id", "id2")]