Динамическое изменение столбца на основе фиксированной символьной строки и всех возможных последовательных значений - PullRequest
0 голосов
/ 09 мая 2019

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

Вот основные характеристики моих данных:

  • В приведенном ниже примере кода вы увидите несколько столбцов с меткой #.Это столбцы, которые я буду использовать для изменения дополнительных столбцов в моем фрейме данных.
  • В моем приложении Shiny эти столбцы # создаются динамически на основе входного файла, выбранного пользователем, и модели, примененной к данным на серверной части.
  • Эти столбцы всегда создаются с одним и тем же именем (т. Е. A #), где 'a' является константой, а # изменяется последовательно в зависимости от факторов в моей модели, которые не имеют отношения ктекущий вопрос.

Цель:

  • Я хотел бы иметь возможность динамически применять линейное преобразование в приведенном ниже коде к каждому потенциальному значению, которое может появиться в df сярлык #.У меня есть предчувствие, что это решение dplyr, которое отслеживает строки, но я больше застрял в том, как найти решение для адаптации к любой переменной #.
  • Желательно использовать аккуратный раствор.

Спасибо.

Код:

library(tibble)
library(dplyr)


dat <- tibble (
  a1 = rnorm (100, 0, 1),
  b  = rnorm (100, 0, 1),
  a2 = rnorm (100, 0, 1),
  c  = rnorm (100, 0, 1)
)

# single vector working example of the transformation applied to one column (need dynamic version). 

dat <- dat %>%
  mutate(
    a1_T = 10*a1 + 50
  )

1 Ответ

1 голос
/ 10 мая 2019

Попробуйте что-нибудь подобное.

x10_50 <- function(x) {
  10 * x + 50
}

df <- 
  dat %>%
  mutate_at(vars(matches("^a.$")), .funs = list(T = ~x10_50(.)))

mutate_at() обычно используется для перезаписи элементов, перечисленных в аргументе vars(), добавление list(T, ...) к .funs = добавит новые переменные. Вы можете поместить вспомогательные глаголы select() в аргумент vars() (starts_with(), ends_with(), one_of()) или передать вектор имен столбцов в виде строк. В этом случае я использовал matches(), потому что он будет принимать регулярное выражение. ^a.$ означает, что столбец должен начинаться с «а», за которым следует еще один символ, а затем конец. list(T, ...) применит вашу функцию и добавит "_T" к возвращаемым переменным.

#       a1      b     a2      c  a1_T  a2_T
#    <dbl>  <dbl>  <dbl>  <dbl> <dbl> <dbl>
#  1.06    0.164 -0.872  1.24   60.6  41.3
# -0.175   0.445  0.330 -2.16   48.2  53.3
#  0.850  -1.67  -0.984 -0.573  58.5  40.2
#  0.0725  0.261  0.681 -1.45   50.7  56.8
#  0.155  -1.16  -0.828 -0.445  51.5  41.7
# -0.818   0.157  0.112  0.715  41.8  51.1

Этот пост содержит больше информации: Создайте новые переменные с помощью mutate_at, оставив при этом оригинальные

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