Как использовать семейство apply для настройки значений списка по групповому индексу - PullRequest
0 голосов
/ 16 января 2019

Хорошо, у меня есть лист Excel с различными сценариями и значениями, и я хотел бы преобразовать некоторые из этих значений с помощью случайного распределения. Я могу сделать это по одному сценарию за раз, но я бы хотел сделать это более компактным способом, возможно, с помощью семейства функций применения. Вот небольшая версия моей матрицы, которую я использую как таблицу данных с setDT:

matrixfromexcel = 

Scenario char num1 num2 num3 val1 val2 val3

1        1    0    4    8    1.22 2.31 7.33

1        1    0    4    8    1.22 2.31 7.33

1        1    0    4    8    1.22 2.31 7.33

1        1    0    4    8    1.22 2.31 7.33

1        1    0    4    8    1.22 2.31 7.33

1        1    0    4    8    1.22 2.31 7.33

1        1    0    4    8    1.22 2.31 7.33

1        1    0    4    8    1.22 2.31 7.33

2        5    2    0    1    4.2  5.011 12.542

2        5    2    0    1    4.2  5.011 12.542 

2        5    2    0    1    4.2  5.011 12.542 

2        5    2    0    1    4.2  5.011 12.542 

2        5    2    0    1    4.2  5.011 12.542 

2        5    2    0    1    4.2  5.011 12.542 

2        5    2    0    1    4.2  5.011 12.542 

2        5    2    0    1    4.2  5.011 12.542

...

1200    66    8    1    0    555  120 1700

Итак, как вы можете видеть, номер сценария разделяет значения на группы, и существует большое количество сценариев, вплоть до 1000 +. Вот что я использовал для добавления случайных чисел из нормально распределенной функции к значениям одного столбца одного сценария:

matrixfromexcel[Scenario == 1, val1 := val1+rnorm(8, 1.22, 1)]

Где 8 - это число различных случайных чисел, 1,22 - это значение, в котором я хочу отцентрировать среднее значение, а 1 - это число стандартных отклонений, которые я хочу получить в случайных числах.

Так что, если я хотел бы перейти от сценария 1 к 1000, я должен попробовать применить функцию или просто использовать цикл? Если применить функцию, не могли бы вы показать мне свое предложение? Спасибо

1 Ответ

0 голосов
/ 16 января 2019

Вы можете использовать аргумент by в data.table и специальный оператор .N, который ссылается на количество строк в каждой группе. Вот кое-что для начала:

library(data.table)
#> Warning: package 'data.table' was built under R version 3.4.4
dt <- data.table(Scenario = rep(c(1,2,3), times = c(8,5,3)), val1 = rep(c(1.22, 4.2, 6), times = c(8,5,3)))
dt[, new_val := val1 + rnorm(.N, val1, 1), keyby = Scenario]

Создано в 2019-01-16 пакетом Представить (v0.2.1)

Для прозрачности я создал new_val вместо перезаписи val1, но вы можете изменить это по своему усмотрению. Также обратите внимание, что вы в настоящее время передали 1 параметру sd для rnorm(). Если это то, что вы хотели, отлично. Если нет, измените соответственно.

...