Как использовать dplyr для создания новой переменной на основе результата функции в сгруппированных данных? - PullRequest
1 голос
/ 02 октября 2019

Предположим, у меня есть следующий data.frame:

set.seed(7)
data = data.frame(a = rnorm(100),
                  b = rnorm(100),
                  c = rnorm(100))

Затем я изменил его:

long = reshape2::melt(data, measure.vars = c("a", "b", "c"))

Затем я бы хотел проверить каждый a, b и cпеременная для UnitRoot присутствия. Поэтому я использую ur.df из пакета Urca. Вот мой вопрос:

Как я могу использовать dplyr , чтобы создать новую переменную индикатора, скажем, 1 или 0, чтобы остаться независимо от того, является ли unitroot или нет. Я думаю, что-то вроде этого:

output = long %>% group_by(variable) %>% 
  do(UR = summary(ur.df(.$value, type = c("trend"), selectlags = "BIC"))) %>% 
  summarise(variable, tau = UR@teststat[1], 
            tau_cri = UR@cval[1,3],
            URT = if_else(UR@teststat[1] < UR@cval[1,3], 
                                    1, 0))

Но последний кусок кода просто генерирует новый data.frame (вывод) с каждой переменной группы, то есть "a, b и c" с индикаторомесли есть или нет единый корень. Но я хочу создать новую переменную в том же data.frame, я имею в виду long . Я хочу этого, потому что мне, возможно, придется разделить мой data.frame в соответствии с этим индикатором (может быть, у вас есть другая идея получить тот же результат другим способом, чем то, о чем я думаю. Это тоже приветствуется, но яБуду признателен, если вы знаете, как делать то, что я хочу).

PD: результат из моего кода выглядит так:

  variable   tau tau_cri   URT
  <fct>    <dbl>   <dbl> <dbl>
1 a        -5.23   -3.15     1
2 b        -7.83   -3.15     1
3 c        -5.89   -3.15     1

1 Ответ

0 голосов
/ 02 октября 2019

Вот другой подход. Мы можем создать два новых столбца, один с объектом ur.df, который хранится как list, чтобы его можно было использовать позже для выполнения других вычислений, если необходимо, и другой (URT), который является индикаторной переменной, представляющей, является лиэто unitroot или нет.

library(dplyr)
library(urca)

long %>%
  group_by(variable) %>%
  mutate(ur.df_obj = list(summary(ur.df(value, type = "trend", selectlags = "BIC"))),
           URT = +(purrr::map_lgl(ur.df_obj, ~.x@teststat[1] < .x@cval[1,3])))


#   variable  value ur.df_obj   URT
#   <fct>     <dbl> <list>    <int>
# 1 a         2.29  <sumurca>     1
# 2 a        -1.20  <sumurca>     1
# 3 a        -0.694 <sumurca>     1
# 4 a        -0.412 <sumurca>     1
# 5 a        -0.971 <sumurca>     1
# 6 a        -0.947 <sumurca>     1
# 7 a         0.748 <sumurca>     1
# 8 a        -0.117 <sumurca>     1
# 9 a         0.153 <sumurca>     1
#10 a         2.19  <sumurca>     1
# … with 290 more rows
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...