Как мутировать для цикла в dplyr - PullRequest
1 голос
/ 01 мая 2019

Я хочу создать несколько переменных запаздывания для столбца во фрейме данных для диапазона значений. У меня есть код, который успешно выполняет то, что я хочу, но не масштабируется для того, что мне нужно (сотни итераций)

У меня есть код ниже, который успешно выполняет то, что я хочу, но не масштабируется для того, что мне нужно (сотни итераций)

Lake_Lag <- Lake_Champlain_long.term_monitoring_1992_2016 %>% 
group_by(StationID,Test) %>% 
   arrange(StationID,Test,VisitDate) %>% 
   mutate(lag.Result1 = dplyr::lag(Result, n = 1, default = NA))%>% 
   mutate(lag.Result5 = dplyr::lag(Result, n = 5, default = NA))%>% 
   mutate(lag.Result10 = dplyr::lag(Result, n = 10, default = NA))%>% 
   mutate(lag.Result15 = dplyr::lag(Result, n = 15, default = NA))%>% 
   mutate(lag.Result20 = dplyr::lag(Result, n = 20, default = NA))

Я бы хотел использовать список c (1,5,10,15,20) или диапазон 1: 150 для создания запаздывающих переменных для моего фрейма данных.

Ответы [ 2 ]

0 голосов
/ 01 мая 2019

Вот подход, который использует некоторые «аккуратные помощники», включенные в dplyr, которые приходят из пакета rlang.

Основная идея заключается в создании нового столбца в mutate(), чейname основано на строке, предоставленной циклом for.

library(dplyr)

grouped_data <- Lake_Champlain_long.term_monitoring_1992_2016 %>% 
  group_by(StationID,Test) %>% 
  arrange(StationID,Test,VisitDate)

for (lag_size in c(1, 5, 10, 15, 20)) {

  new_col_name <- paste0("lag_result_", lag_size)

  grouped_data <- grouped_data %>% 
    mutate(!!sym(new_col_name) := lag(Result, n = lag_size, default = NA))
}

sym(new_col_name) := - это динамический способ записи lag_result_1 =, lag_result_2 = и т. д. при использовании таких функций, как mutate() илиsummarize() из пакета dplyr.

0 голосов
/ 01 мая 2019

Мы можем использовать shift из data.table, что может принимать несколько значений для n.В соответствии с ?shift

n - неотрицательный целочисленный вектор, обозначающий смещение на опережение или отставание от входа.Чтобы создать несколько векторов опережения / отставания, укажите несколько значений n

. Преобразуйте файл «data.frame» в «data.table» (setDT), order в «StationID», «Test ',' VisitDate 'в i, сгруппированные по' StationID ',' Test '), получают lag (по умолчанию type из shift является "отставанием") для "Result" с n в качествевектор значений и присвойте (:=) выходные данные вектору имен столбцов (созданному с помощью paste0)

library(data.table)
i1 <- c(1, 5, 10, 15, 20)
setDT(Lake_Champlain_long.term_monitoring_1992_2016)[order(StationID, 
    Test, VisitDate), paste0("lag.Result", i) := shift(Result, n= i),
        by = .(StationID, Test)][]

ПРИМЕЧАНИЕ. Показано очень эффективное решение

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