studio repetidos repetidas quitar filas eliminar duplicated duplicados duplicadas datos contar como columnas r duplicates conditional data.table

repetidos - eliminar filas en r



Crear filas duplicadas segĂșn las condiciones en R (4)

Tengo un data.table que se parece a esto

dt <- data.table(ID=c("A","A","B","B"),Amount1=c(100,200,300,400), Amount2=c(1500,1500,2400,2400),Dupl=c(1,0,1,0)) ID Amount1 Amount2 Dupl 1: A 100 1500 1 2: A 200 1500 0 3: B 300 2400 1 4: B 400 2400 0

Necesito duplicar cada fila que tenga un 1 en la columna Dupl y reemplazar el valor Amount1 con el valor Amount2 en esa fila duplicada. Además de eso, necesito darle a esa fila duplicada el valor 2 en Dupl. Esto significa que debería verse así:

ID Amount1 Amount2 Dupl 1: A 100 1500 1 2: A 1500 1500 2 3: A 200 1500 0 4: B 300 2400 1 5: B 2400 2400 2 6: B 400 2400 0

¡Cualquier ayuda es muy apreciada! Saludos cordiales,

Tim


Esto parece hacer lo que estás pidiendo. Probablemente pueda ser refinado un poco ...

library(splitstackshape) expandRows(dt, dt$Dupl+1, count.is.col = FALSE)[ Dupl != 0, Dupl := cumsum(Dupl), by = ID][ , Amount1 := ifelse(Dupl > 1, Amount2[-1], Amount1)][] # ID Amount1 Amount2 Dupl # 1: A 100 1500 1 # 2: A 1500 1500 2 # 3: A 200 1500 0 # 4: B 300 2400 1 # 5: B 2400 2400 2 # 6: B 400 2400 0


Puede rbind una copia de los datos subconjuntos con las transformaciones correctas realizadas:

rbind(dt,copy(dt[Dupl==1])[,Amount1:=Amount2][,Dupl:=Dupl+1]) ID Amount1 Amount2 Dupl 1: A 100 1500 1 2: A 200 1500 0 3: B 300 2400 1 4: B 400 2400 0 5: A 1500 1500 2 6: B 2400 2400 2

Alternativamente, puede obtener los duplicados mediante una configuración secundaria y luego transformar las filas duplicadas mediante un paso intermedio. Esto mantiene la fila duplicada al lado del original como en el ejemplo en la pregunta:

x <- dt[rep(seq(dt[,Dupl]),times=dt[,Dupl==1]+1)] x[duplicated(x),c("Amount1","Dupl"):=list(Amount2,Dupl+1)] x ID Amount1 Amount2 Dupl 1: A 100 1500 1 2: A 1500 1500 2 3: A 200 1500 0 4: B 300 2400 1 5: B 2400 2400 2 6: B 400 2400 0


Tu podrías intentar

rbind(dt,dt[Dupl==1][,c(''Amount1'', ''Dupl'') := list(Amount2, 2)])


Usando dplyr

require("data.table") require("dplyr") #data dt <- data.table(ID=c("A","A","B","B"),Amount1=c(100,200,300,400), Amount2=c(1500,1500,2400,2400),Dupl=c(1,0,1,0)) #result rbind(dt, dt %>% filter(Dupl==1) %>% mutate(Dupl=2, Amount1=Amount2)) # ID Amount1 Amount2 Dupl # 1: A 100 1500 1 # 2: A 200 1500 0 # 3: B 300 2400 1 # 4: B 400 2400 0 # 5: A 1500 1500 2 # 6: B 2400 2400 2