seleccionar - identificar duplicados en r
Extraiga las filas que tienen duplicados para cierta columna, pero son únicos en otra columna (3)
Estoy haciendo algo de codificación en R. Me gustaría mostrar las filas que tienen duplicados para las columnas ID y NAME, pero tienen diferentes valores para AGE.
Por ejemplo, tengo esta tabla:
ID | NAME | AGE
111| Mark| 22
222| Anne| 21
333| Chery| 30
444| Megan| 16
555| Charles| 37
111| Mark| 23
222| Anne| 22
333| Chery| 30
111| Mark| 22
A partir de ahora tengo este código:
readfile <- read.csv(file=''/home/user/shane/names.csv'')
dat <- data.frame(ID=c(readfile$ID),NAME=c(readfile$NAME),AGE=c(readfile$AGE))
nam <- duplicated(dat[,c(''ID'',''NAME)]) | duplicated(dat[,c(''ID'',''NAME], fromLast = TRUE)
readfile[nam,]
La salida se ve así:
ID | NAME | AGE
111| Mark| 22
222| Anne| 21
333| Chery| 30
111| Mark| 23
222| Anne| 22
333| Chery| 30
111| Mark| 22
Me gustaría que la salida sea:
ID | NAME | AGE
111| Mark| 22
222| Anne| 21
111| Mark| 23
222| Anne| 22
111| Mark| 22
Me gustaría eliminar las columnas con ID = 333 ya que tienen el mismo valor en Age. ¿alguien tiene una sugerencia?
Acabo de ajustar tu código :)
dat <- data.frame(ID=c(111,222,333,444,555,111,222,333,111), NAME=c(''Mark'',''Anne'',''Chery'',''Megan'',''Charles'',''Mark'',''Anne'',''Chery'',''Mark''), AGE=c(22,21,30,16,37,23,22,30,22))
library(plyr)
dat1 <- ddply(dat,.(ID,NAME, AGE),nrow)
dat2 <- merge(dat1,dat,by=c("ID","NAME","AGE"))
dat3 <- dat2[!(!duplicated(dat2[,1:2], fromLast=T) & !duplicated(dat2[,1:2])),]
dat3[dat3$ID %in% dat3[dat3$V1==1,1],1:3]
¡Espero que esto ayude!
(editó esta solución después de que @ shia1717 mencionó su requisito específico - consulte la sección de comentarios para más detalles)
Aquí hay una opción con data.table
library(data.table)
setDT(dat)[, .SD[.N >1 & !sum(duplicated(AGE))], by = .(ID, NAME)]
# ID NAME AGE
#1: 111 Mark 22
#2: 111 Mark 23
#3: 222 Anne 21
#4: 222 Anne 22
Una solución dplyr
:
library(dplyr)
dat %>%
group_by(ID, NAME) %>%
filter(n() > 1, sum(duplicated(AGE)) == 0) %>%
ungroup()
# A tibble: 4 x 3
ID NAME AGE
<dbl> <fctr> <dbl>
1 111 Mark 22
2 222 Anne 21
3 111 Mark 23
4 222 Anne 22
Usé los datos amablemente provistos por @Prem.