Моя структура данных выглядит следующим образом:
Я хочу расширить строки делением и интервалом. Если интервал равен 4, а деление равно 2, то разверните строку восемь раз, так как 4 x 2 равно 8. Аналогично, если интервал равен 2, а деление равно 3, то разверните строку 6 раз, так как 2 x 3 равно 6.
Код, который я пробовал:
dt1[, row_index := 1:.N]
dt1 <- dt1[rep(seq_len(.N), dt1$division), ]
dt1[, new_row := seq_len(division) - 1 + interval * (row_index - 1), by = row_index]
Ожидаемый результат:
Для этого мы можем использовать rep(., times=)
:
dt1[rep(seq(.N), times = division_num * interval),]
# rad_1 division_num interval
# <int> <int> <int>
# 1: 1 2 4
# 2: 1 2 4
# 3: 1 2 4
# 4: 1 2 4
# 5: 1 2 4
# 6: 1 2 4
# 7: 1 2 4
# 8: 1 2 4
# 9: 1 3 2
# 10: 1 3 2
# ---
# 14: 1 3 2
# 15: 2 3 3
# 16: 2 3 3
# 17: 2 3 3
# 18: 2 3 3
# 19: 2 3 3
# 20: 2 3 3
# 21: 2 3 3
# 22: 2 3 3
# 23: 2 3 3
Данные
dt1 <- data.table::as.data.table(structure(list(rad_1 = c(1L, 1L, 2L), division_num = c(2L, 3L, 3L), interval = c(4L, 2L, 3L)), class = c("data.table", "data.frame"), row.names = c(NA, -3L)))
Вы можете использовать tidyr::uncount
tidyr::uncount(df, division_num * interval)
rad_1 division_num interval
1 1 2 4
2 1 2 4
3 1 2 4
4 1 2 4
5 1 2 4
6 1 2 4
7 1 2 4
8 1 2 4
9 1 3 2
10 1 3 2
11 1 3 2
12 1 3 2
13 1 3 2
14 1 3 2
15 2 3 3
16 2 3 3
17 2 3 3
18 2 3 3
19 2 3 3
20 2 3 3
21 2 3 3
22 2 3 3
23 2 3 3
Альтернативное решение — установить значение для расширения, создав объект expand
:
dt1<- data.table(rad_1= c(1,1,2),
division_num= c(2,3,3),
interval= c(4,2,3))
expand <- dt1$division_num * dt1$interval
dt.expanded <- dt1[rep(1:nrow(dt1), expand)]
dt.expanded
rad_1 division_num interval
1: 1 2 4
2: 1 2 4
3: 1 2 4
4: 1 2 4
5: 1 2 4
6: 1 2 4
7: 1 2 4
8: 1 2 4
9: 1 3 2
10: 1 3 2
11: 1 3 2
12: 1 3 2
13: 1 3 2
14: 1 3 2
15: 2 3 3
16: 2 3 3
17: 2 3 3
18: 2 3 3
19: 2 3 3
20: 2 3 3
21: 2 3 3
22: 2 3 3
23: 2 3 3