Вызов символьной строки в имена объектов внутри функции - PullRequest
0 голосов
/ 20 апреля 2020

В настоящее время у меня есть очень длинный и повторяющийся бит кода для нормализации и инверсии данных ((x-min) / (max-min) * - 1) +1), который я хочу немного очистить.

Это небольшой пример того, как он выглядит в настоящее время:

W3_E1_Norm_New <- W3_E1_Average%>%
  mutate(W3_E1_Norm_New = ((W3_E1_zoo-W3_E1_Min)/(W3_E1_Max-W3_E1_Min)*-1)+1)
W3_E2_Norm_New <- W3_E2_Average%>%
  mutate(W3_E2_Norm_New = ((W3_E2_zoo-W3_E2_Min)/(W3_E2_Max-W3_E2_Min)*-1)+1)
W3_E3_Norm_New <- W3_E3_Average%>%
  mutate(W3_E3_Norm_New = ((W3_E3_zoo-W3_E3_Min)/(W3_E3_Max-W3_E3_Min)*-1)+1)

Каждый «W3_E1» относится к идентификатору образца, и в настоящее время каждый идентификатор образца требует, чтобы две строки кода были выписывается каждый раз. В идеале я хотел бы написать функцию, которая может вызывать символьную строку (Sample_IDs) в имена каждого фрейма данных, поэтому что-то вроде

a_Norm_New

вернет

W3_E1_Norm_New

затем

W3_E2_Norm_New

et c.

Есть ли способ написать функцию, которая могла бы выполнить sh это?

Большое спасибо

Ответы [ 2 ]

0 голосов
/ 20 апреля 2020

С data.table очень легко написать функции, которые используют имена переменных в кавычках (см. сообщение в блоге, которое я написал на эту тему ).

Здесь мы вставляем шаблон имени вашего столбца везде с переменной sufx:

library(data.table)

normalize <- function(dt, sufx = "W3_E1"){
  df <- as.data.table(dt)
  df[, (paste0(sufx,"_Norm_New")) := (
    (get(paste0(sufx,_zoo)) - get(paste0(sufx,"_Min"))
     )/(
       get(paste0(sufx,"_Max")) - get(paste0(sufx,"_Min"))
        )*-1)+1)
}

Здесь код нелегко прочитать, потому что я хотел показать, что это можно сделать в одну строку, но вы можете легко повысить читаемость.

В этом решении вы используете get, чтобы заключить в кавычки имя вашей переменной.

0 голосов
/ 20 апреля 2020

У меня нет ваших данных, но это должно работать. Определите функцию:

my_fun <- function (x) {

  norm_new <- paste0(x,"_Norm_New")
  average <- paste0(x,"_Average")
  zoo <- paste0(x, "_zoo")
  min <- paste0(x, "_Min")
  max <- paste0(x, "_Max")

   df <- get(average) %>%
    mutate(new_norm = ((zoo - min) / (max - min) * - 1) + 1)

  assign(df, norm_new)
}

Затем запустите для l oop:

Sample_IDs <- c("W3_E1", "W3_E2", "W3_E3")

for (i in Sample_IDs) {
  my_fun(i)
}
...