R - применение функции с разными параметрами к частоте случайного ряда - PullRequest
0 голосов
/ 24 марта 2020

У меня есть DataFrame, который выглядит следующим образом:

             DateTime wind_speed_2m   ws_80m      e_50   ws_10m
1 1980-01-01 00:00:00      5.729406 5.969776 11.800519 4.435526
2 1980-01-01 01:00:00      5.483071 5.713106 10.106499 4.244821
3 1980-01-01 02:00:00      5.107409 5.321683  7.523108 3.953995
4 1980-01-01 03:00:00      5.923226 6.171727 13.133396 4.585575
5 1980-01-01 04:00:00      5.889817 6.136917 12.903649 4.559711
6 1980-01-01 05:00:00      5.573752 5.807591 10.730101 4.315024

Первый столбец - это столбец DateTime, второй - столбец, скорость ветра которого составляет 2 метра, третья - скорость ветра 80 метров, четвертая - нет релевантный и 5-й имеет скорость ветра на 10 м.

У меня есть следующий вектор частот:

10.65 20.87  2.25  0.72  0.44  0.74  0.62  0.84  3.73 25.55 32.61  0.98

и следующий вектор параметров A и k параметров, которые связаны с каждой частотой :

A параметры

7.67  6.51  2.49  1.28  1.25  1.79  1.97  1.99  3.86  9.34 10.12  1.76

k параметров

2.428 2.150 0.986 1.057 1.131 1.658 1.861 1.479 1.334 3.385 3.725 1.303

Я сгруппировал свои данные по годам, используя dplyr следующим образом:

f <- f %>%
    mutate(Y = year(DateTime)) %>%
    group_by(Y)

Я также написал следующую функцию:

downscale_wind <- function(A_micro, k_micro, v_rean, A_rean = 5.407803, k_rean = 2.849805){

    v_micro <- A_micro * (v_rean/A_rean)^(k_rean/k_micro)
  return(v_micro)
}

downscale_wind <- Vectorize(downscale_wind)

Параметры A_rean и k_rean должны оставаться в качестве значений по умолчанию.

То, что я хочу сделать, но не могу, это создать новый столбец следующим образом:

Для каждой группы в f DataFrame, поэтому для каждого года:

  • применить функцию downscale_wind к столбцу ws_10m с этим столбец является входом v_rean.
  • Однако на 10,65% (первое значение вектора частоты) случайные строки этой группы применяют его, используя первое значение A (7,67) в векторе A (как A_micro) и первое значение k (2,428) в векторе k как (k_micro)
  • Затем для 20,87% случайных рядов группы примените его, используя 2-е значение A и 2-е значение k
  • и так далее, пока не достигнете последнего значения частотного вектора (0,98%)

Я бы хотел оставить все столбцы без изменений, только создание нового столбца для f DataFrame

1 Ответ

0 голосов
/ 24 марта 2020

Не ясно, как должен быть возвращен вывод

library(dplyr)
library(purrr)
library(lubridate)
df1 %>%
   group_split(Y = year(DateTime)) %>% 
   map(~ {dat <- .x; map2(A_params, K_params,
         ~ downscale_wind(.x, .y, v_rean = dat$ws_10m))})

data

df1 <- structure(list(DateTime = structure(c(315550800, 315554400, 315558000, 
315561600, 315565200, 315568800), class = c("POSIXct", "POSIXt"
), tzone = ""), wind_speed_2m = c(5.729406, 5.483071, 5.107409, 
5.923226, 5.889817, 5.573752), ws_80m = c(5.969776, 5.713106, 
5.321683, 6.171727, 6.136917, 5.807591), e_50 = c(11.800519, 
10.106499, 7.523108, 13.133396, 12.903649, 10.730101), ws_10m = c(4.435526, 
4.244821, 3.953995, 4.585575, 4.559711, 4.315024)), row.names = c("1", 
"2", "3", "4", "5", "6"), class = "data.frame")


K_params <- c(2.428, 2.15, 0.986, 1.057, 1.131, 1.658, 1.861, 1.479, 1.334, 
3.385, 3.725, 1.303)
A_params <- c(7.67, 6.51, 2.49, 1.28, 1.25, 1.79, 1.97, 1.99, 3.86, 9.34, 
10.12, 1.76)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...