Программирование с помощью mutate для создания нового столбца данных

E сть data.frame вот так:

df <- data.frame("Config" = c("C1","C1","C2","C2"), "SN1" = 1:4, "SN2" = 5:8)

Я пытаюсь сделать df %<>% mutate более общий. Вот пример:

df %<>%
  mutate(
    Tag=paste(
      Config,
      as.character(SN1),
      as.character(SN2),
      sep="_"
    )
  )

Что нужно, это передать вектор c("Config", "SN1", "SN2") к вышесказанному mutate или альтернатива, которая делает ту же работу, а именно вставка нового столбца Tag в вышесказанное data.frame, Спасибо за помощь

1 ответ

Решение

Как я уже упоминал в комментарии, это не вопрос об операторе %<>% но об использовании нестандартной оценки (NSE) в dplyr функция. В этом есть довольно хорошая виньетка, но все еще довольно сложно освоить NSE/ аккуратную оценку.

Кроме того, как я уже говорил, то, что вы делаете в качестве примера, это именно то, что tidyr::unite делает, так что если бы это было все, что вам нужно, вам на самом деле не нужно ничего писать. Но это хороший простой пример для использования.

В этой функции custom_uniteпервый аргумент .dataфрейм данных, с которым вы работаете (для конвейера используется первый аргумент - фрейм данных). затем ... захватывает гибкое количество пустых имен столбцов для вставки вместе, new_col является пустым именем столбца создаваемого столбца, и sep передается как есть paste, (Я случайно переключил порядок аргументов из tidyr::unite, который занимает col, ... вместо ..., new_col.)

Вам нужно создать цитаты из ваших столбцов. Для одной голой колонны new_col, ты можешь использовать enquo, но для гибкого количества столбцов вы используете quos на ..., который вы потом соедините !!!,

Чтобы создать новый столбец, вы назначите := вместо = на цитату без кавычек.

library(tidyverse)

custom_unite <- function(.data, ..., new_col, sep = "_") {
  cols <- quos(...)
  new_col_quo <- enquo(new_col)

  .data %>%
    mutate(!!new_col_quo := paste(!!!cols, sep = sep))
}

df %>%
  custom_unite(Config, SN1, SN2, new_col = Tag)
#>   Config SN1 SN2    Tag
#> 1     C1   1   5 C1_1_5
#> 2     C1   2   6 C1_2_6
#> 3     C2   3   7 C2_3_7
#> 4     C2   4   8 C2_4_8

Создано 2018-12-14 пакетом представлением (v0.2.1)

Другие вопросы по тегам