Программирование с помощью 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)