Создание цикла с помощью dnorm и добавление результата в таблицу - PullRequest
1 голос
/ 06 ноября 2019

У меня есть таблица с 1000 строк, где каждая строка - это отдельная переменная. Каждая строка содержит имя, значение, среднее и стандартное отклонение.

Table_1 <- data.table(Variables = c("a","b","c"), Value = 1000, mean = -(3:1), sd   = 2)

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

Variables Value  mean sd
a         1000   -3   2
b         1000   -2   2
c         1000   -1   2
...

Для каждой строки я хочу добавить результат следующего:

set.seed(1)
sq1 <- seq(from = -3, to = 3, length.out = 180)
rn1 <- dnorm(sq1, mean = Table_1$mean[1], sd = Table_1$sd[1])
rn2 <- Table_1$Value[1] * rn1/sum(rn1)

Я пробовалцикл, но у меня проблема с частью rn1 и я даже не могу добраться до части rn2. Следующий цикл дает мне NULL.

Table_2 <- for(i in 1:3) {dnorm(sq1, mean = Table_1$mean[i], sd = Table_1$sd[i])}

Результаты должны выглядеть примерно так, но вывод также может быть в отдельной таблице или в длинной форме:

Variables Value  mean sd 1          2          3          ...
a         1000   -3   2  13.3182941 13.3164238 13.3108143 ...
b         1000   -2   2  8.5720647  8.6429855  8.7120456  ...
c         1000   -1   2  4.939155   5.021927   5.104651   ...

есть идеи, как поместить его в цикл или применить функцию или функцию карты?

1 Ответ

0 голосов
/ 06 ноября 2019

Я бы порекомендовал не использовать цикл в этом случае. Один из вариантов будет lapply:

my_fun <- function(value, mean, sd) {
  rn1 <- dnorm(seq(from = -3, to = 3, length.out = 180), mean, sd)
  return(value * rn1 / sum(rn1))
}

lapply(1:3, function(i) my_fun(Table_1$Value[i], Table_1$mean[i], Table_1$sd[-1]))

Другое решение будет использовать пакет tidyverse:

library(tidyverse)

set.seed(1)
new_data <- tibble(Variables = c("a","b","c"), value = 1000,
                   mean = (-3):(-1), sd = 2) %>%
  mutate(result = pmap(list(value, mean, sd), my_fun))

# A tibble: 3 x 5
  Variables value  mean    sd result     
  <chr>     <dbl> <int> <dbl> <list>     
1 a          1000    -3     2 <dbl [180]>
2 b          1000    -2     2 <dbl [180]>
3 c          1000    -1     2 <dbl [180]>

В последнем примере для каждой строки создается новый результат столбца, которыйсодержит значения. Для доступа к этим значениям вы можете использовать new_data$result[[1]].

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...