Создание повторяющихся строк на основе условий в R
у меня есть сведения.таблица, которая выглядит так
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
мне нужно дублировать каждую строку, которая имеет 1 в столбце Dupl, и заменить значение Amount1 значением Amount2 в этой дублированной строке. Кроме того, мне нужно дать этой дублированной строке значение 2 в Dupl. Это означает, что он должен выглядеть так:
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
любая помощь очень ценится! С уважением,
Тим
4 ответов
используя 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
вы можете rbind
копия подсетевых данных с правильными преобразованиями:
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
кроме того, вы можете получить дубликаты суб-параметр, а затем преобразовать дублированных строк используя промежуточный этап. Это сохраняет дублированную строку рядом с оригиналом, как в Примере в вопросе:
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
Кажется, это делает то, о чем вы просите. Возможно, можно немного уточнить...
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