varias repeated remove one graficas duplicated duplicate column based r dataframe rows

repeated - unique r



Eliminar filas del marco de datos R (5)

¿Estás buscando un subset() ?

dat <- airquality dat.sub <- subset(dat, Temp > 80 & Month < 10) dim(dat) dim(dat.sub)

Aplicado a tu ejemplo:

df.sub <- subset(df, plan != 0 & sevk != 0)

Tengo el siguiente marco de datos:

> str(df) ''data.frame'': 3149 obs. of 9 variables: $ mkod : int 5029 5035 5036 5042 5048 5050 5065 5071 5072 5075 ... $ mad : Factor w/ 65 levels "Akgün Kasetçilik ",..: 58 29 59 40 56 11 33 34 19 20 ... $ yad : Factor w/ 44 levels "BAKUGAN","BARBIE",..: 1 1 1 1 1 1 1 1 1 1 ... $ donem: int 201101 201101 201101 201101 201101 201101 201101 201101 201101 201101 ... $ sayi : int 201101 201101 201101 201101 201101 201101 201101 201101 201101 201101 ... $ plan : int 2 2 3 2 2 2 7 3 2 7 ... $ sevk : int 2 2 3 2 2 2 6 3 2 7 ... $ iade : int 0 0 3 1 2 2 6 2 2 3 ... $ satis: int 2 2 0 1 0 0 0 1 0 4 ...

Quiero eliminar 21 filas específicas de este marco de datos.

> a <- df[df$plan==0 & df$sevk==0,] > nrow(a) [1] 21

Entonces, cuando elimine esas 21 filas, tendré un nuevo marco de datos con 3149 - 21 = 3128 filas. Encontré la siguiente solución:

> b <- df[df$plan!=0 | df$sevk!=0,] > nrow(b) [1] 3128

Mi solución anterior usa una expresión lógica modificada ( != vez de == y | lugar de & ). Además de modificar la expresión lógica original, ¿cómo puedo obtener el nuevo marco de datos sin esas 21 filas? Necesito algo así:

> df[-a,] #does not work

EDIT (especialmente para los downvoters, espero que comprendan por qué necesito una solución alternativa): pedí una solución diferente porque estoy escribiendo un código largo, y hay varias asignaciones de variables (como las de mi ejemplo) en varias partes de mi código. Entonces, cuando necesito eliminar filas en el avance de partes de mi código, no quiero volver atrás y tratar de escribir el inverso de las expresiones lógicas dentro de las expresiones -like. Es por eso que df[-a,] es más útil para mí.


No veo por qué te opones a tu solución, pero aquí hay otra manera.

which( df[df$plan==0 & df$sevk==0,], arr.ind=TRUE) ->killlist newdf <- df[-c(killlist[1,])]


Puede usar los rownames de rownames para especificar un rownames de datos "complementario". Es más fácil si son nombres de fila numéricos:

df[-as.numeric(rownames(a)),]

Pero más generalmente puedes usar:

df[setdiff(rownames(df),rownames(a)),]


Solo niegue su subíndice lógico:

a <- df[!(df$plan==0 & df$sevk==0),]


Ya casi estás ahí. ''a'' debe ser un vector de índices:

df <- data.frame(plan=runif(10),sevk=runif(10)) a <- c(df$plan<.1 | df$sevk < .1) # some logical thing df[-a,]

o, con tus datos:

a <- c(df$plan==0 & df$sevk==0) df[-a,]