Есть ли способ расширить строки во фрейме данных, используя два столбца?

Моя структура данных выглядит следующим образом:

рад_1 номер_разделения интервал 1 2 4 1 3 2 2 3 3

Я хочу расширить строки делением и интервалом. Если интервал равен 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]

Ожидаемый результат:

рад_1 номер_разделения интервал 1 2 4 1 2 4 1 2 4 1 2 4 1 2 4 1 2 4 1 2 4 1 2 4 1 3 2 1 3 2 1 3 2 1 3 2 1 3 2 1 3 2 2 3 3 2 3 3 2 3 3 2 3 3 2 3 3 2 3 3 2 3 3 2 3 3 2 3 3

54
3

Ответы:

Для этого мы можем использовать 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

Интересные вопросы для изучения

Сохранять значение при использовании data.table::fcase() вместо dplyr::case_when()Как построить групповые двухмерные квантильные графики плотности с пользовательской функцией и последовательной раскраской?Как я могу работать со всеми комбинациями двух элементов списка?Почему я не могу использовать «предсказать» после загрузки gbm, вычисленного с помощью gbm.step?Подсчет последовательных столбцов, удовлетворяющих условию в RСохранять значение при использовании data.table::fcase() вместо dplyr::case_when()Data.table: сохранять исходное имя столбца при применении функции внутри оператора «by=variable»R: получить функцию в таблице data.table с критериями ifelseData.table сдвиг() в версии 1.15.2 не работает, когда строки подмножества в i по столбцу - `DT[i == TRUE, (cols) := сдвиг(), by = col]`GForce data.table — применение нескольких функций к нескольким столбцам (с необязательными аргументами)