studio repetidos repetidas quitar filas eliminar duplicated duplicados duplicado duplicadas datos contar como columnas r duplicates unique aggregate apply

repetidos - eliminar filas en r



Cómo generar filas duplicadas (6)

Aprendí esto el otro día. No necesitará volver a ordenar la salida.

s <- split(dat, do.call(paste, dat[-4])) Reduce(rbind, Filter(function(x) nrow(x) > 1, s)) # x1 x2 x3 x4 # 2 2 8 18 17 # 5 2 8 18 5 # 1 34 14 45 53 # 3 34 14 45 20

Tengo los siguientes datos:

x1 x2 x3 x4 34 14 45 53 2 8 18 17 34 14 45 20 19 78 21 48 2 8 18 5

En las filas 1 y 3; y 2 y 5 los valores para las columnas X1; X2, X3 son iguales. ¿Cómo puedo generar solo esas 4 filas, con números iguales? La salida debe estar en el siguiente formato:

x1 x2 x3 x4 34 14 45 53 34 14 45 20 2 8 18 17 2 8 18 5

Por favor, hágame preguntas si algo no está claro.

PREGUNTA ADICIONAL: en la salida

x1 x2 x3 x4 34 14 45 53 34 14 45 20 2 8 18 17 2 8 18 5

encuentre la suma de valores en la última columna:

x1 x2 x3 x4 34 14 45 73 2 8 18 22


Hay otra forma de resolver ambas preguntas usando dos paquetes.

library(DescTools) library(dplyr) dat[AllDuplicated(dat[1:3]), ] %>% # this line is to find duplicates group_by(x1, x2) %>% # the lines followed are to sum up mutate(x4 = sum(x4)) %>% unique() # Source: local data frame [2 x 4] # Groups: x1, x2 # # x1 x2 x3 x4 # 1 34 14 45 73 # 2 2 8 18 22


Puede hacer esto con duplicated , que comprueba si las filas se duplican cuando pasa una matriz. Como solo está revisando las primeras tres columnas, debe pasar dat[,-4] a la función.

dat[duplicated(dat[,-4]) | duplicated(dat[,-4], fromLast=T),] # x1 x2 x3 x4 # 1 34 14 45 53 # 2 2 8 18 17 # 3 34 14 45 20 # 5 2 8 18 5


También puede usar el comando de tabla:

> d1 = ddf[ddf$x1 %in% ddf$x1[which(table(ddf$x1)>1)],] > d2 = ddf[ddf$x2 %in% ddf$x2[which(table(ddf$x2)>1)],] > rr = rbind(d1, d2) > rr[!duplicated(rbind(d1, d2)),] x1 x2 x3 x4 1 34 14 45 53 3 34 14 45 20 2 2 8 18 17 5 2 8 18 5

Para sumar en la última columna:

> rrt = data.table(rr2) > rrt[,x4:=sum(x4),by=x1] > rrt[rrt[,!duplicated(x1),]] x1 x2 x3 x4 1: 34 14 45 73 2: 2 8 18 22


Una alternativa usando ave :

dat[ave(dat[,1], dat[-4], FUN=length) > 1,] # x1 x2 x3 x4 #1 34 14 45 53 #2 2 8 18 17 #3 34 14 45 20 #5 2 8 18 5


el primero similar al anterior, deje z sea su data.frame:

library(DescTools) (zz <- Sort(z[AllDuplicated(z[, -4]), ], decreasing=TRUE) ) # now aggregate aggregate(zz[, 4], zz[, -4], FUN=sum) # use Sort again, if needed...