Как динамически переименовать столбцы в функции в R? - PullRequest
0 голосов
/ 03 февраля 2020

Вот функция, которую я пытаюсь встроить в R

lag_decay_gen <- function(data,col,lag_val,decay_val)
  {
  temp <- lag(col, n = lag_val*7, default =0)
  temp <- temp + shift(temp)*decay_val
  temp <- cbind(data,temp)
  }

Здесь data = основной набор данных, в то время как col = столбец набора данных

Как правило, вход для col будет чем-то выглядеть так - data $ 'column_name'

Здесь внутри функции я бы хотел, чтобы временный столбец динамически переименовывался в

paste(col,lag_val,decay_val, sep = "_")

, где col - это имя столбца, но это значение под столбцом, которое я передаю функции и, следовательно, возникает ошибка.

Более того, как мне go рассказать о построении функции lag_decay_gen, если мой входной столбец содержит несколько столбцов. Любая помощь будет высоко ценится.

1 Ответ

0 голосов
/ 03 февраля 2020

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

lag_decay_gen <- function(data, col, lag_val, decay_val){
  values <- data[[col]]
  temp <- dplyr::lag(values, n = lag_val*7, default = 0)
  temp <- temp + dplyr::lag(temp)*decay_val
  new_col <- paste(col, lag_val, decay_val, sep = "_")
  data[[new_col]] <- temp
  data
}

lag_decay_all <- function(data, cols, lag_val, decay_val){
  for(col in cols) {
    data <- lag_decay_gen(data, col, lag_val, decay_val)
  }
  data
}

Теперь протестируйте функции. Для этого я буду использовать встроенный набор данных iris. Во-первых, чтобы передать только один столбец name .

df1 <- iris[1:2]

new_df1 <- lag_decay_gen(df1, "Sepal.Length", 1, 0.5)

head(new_df1)
#  Sepal.Length Sepal.Width Sepal.Length_1_0.5
#1          5.1         3.5                 NA
#2          4.9         3.0                  0
#3          4.7         3.2                  0
#4          4.6         3.1                  0
#5          5.0         3.6                  0
#6          5.4         3.9                  0

и передать несколько имен столбцов одновременно:

names_cols <- names(df1)
lag_decay_all(iris[1:2], names_cols, 1, 0.5)

Обратите внимание, что функция lag_decay_all также может использоваться для вычисления новых столбцов, если это только один столбец.

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