zusammenführen - Erstellen Sie doppelte Zeilen basierend auf Bedingungen in R




r zeilen löschen (3)

Ich habe eine data.table, die so aussieht

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

Ich muss jede Zeile duplizieren, die eine 1 in der Dupl-Spalte hat und den Betrag1-Wert durch den Betrag2-Wert in dieser duplizierten Zeile ersetzen. Außerdem muss ich der duplizierten Zeile den Wert 2 in Dupl geben. Das heißt, es sollte so aussehen:

   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

Jede Hilfe wird sehr geschätzt! Mit freundlichen Grüßen,

Tim


Dies scheint zu tun, was Sie verlangen. Kann wohl etwas verfeinert werden ...

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

Du könntest es versuchen

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

Verwenden von 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






data.table