Бизнес блог #1
Выжимаю книги до самой сути.
? Реклама - @jaMasha
? Хотите свою книгу? Мы напишем её за вас и сделаем книгу бестселлером. Подробности в боте @Summary_library_bot
? Оставьте след в истории с помощью книги
https://expert-book.pro
Фильмы и сериалы со всей планеты. Мы знаем, что посмотреть, где посмотреть и на что сходить в кино.
Last updated 2 days, 10 hours ago
Все материалы размещены по партнёрской програме ivi.ru | All materials are posted on the partner program ivi.ru
По всем вопросам: @kuzr103
Купить рекламу: https://telega.in/c/k1noxa103
Основной канал: https://t.me/kino_hd2
Last updated 2 weeks, 1 day ago
Работас динамическими именами столбцов в dplyr: sym(), syms() и оператор !!
Часто при работе с данными в R возникает необходимость обращаться к столбцам таблицы по их именам, которые могут передаваться как строки. Это может быть полезно, если имена столбцов не известны заранее или задаются динамически в функциях. В dplyr
для таких задач существует механизм tidy evaluation, и одними из ключевых инструментов являются функции sym()
, syms()
и оператор !!
.
Проблема:
Обычно в dplyr мы обращаемся к столбцам напрямую, как показано ниже:
```
library(dplyr)
data <- tibble(
Area = c('IT', 'Finance', NA),
Date = as.Date(c('2023-01-01', NA, '2023-03-15'))
)
# Фильтруем строки, где нет пропусков в столбцах 'Area' и 'Date'
filtered_data <- data %>%
filter(!is.na(Area), !is.na(Date))
```
Но что, если имена столбцов будут передаваться в виде строк, например через аргументы функции? Простое использование строк в filter()
не сработает.
Решение: sym() и оператор !!
Функция sym()
преобразует строку в символ (символ — это объект, который может быть интерпретирован как имя переменной), а оператор !!
используется для развертывания этого символа в выражении. Давайте рассмотрим, как это работает:
```
library(dplyr)
# Функция для фильтрации данных на основе имен столбцов, переданных как строки
filter_data <- function(data, col_name1, col_name2) {
col1 <- sym(col_name1)
col2 <- sym(col_name2)
data %>%
filter(!is.na(!!col1), !is.na(!!col2))
}
# Пример данных
data <- tibble(
Area = c('IT', 'Finance', NA),
Date = as.Date(c('2023-01-01', NA, '2023-03-15'))
)
# Фильтруем данные, используя имена столбцов как строки
filtered_data <- filter_data(data, 'Area', 'Date')
print(filtered_data)
```
В этой функции:
sym(col_name1)
и sym(col_name2)
преобразуют строки в символы, которые затем могут использоваться в dplyr::filter()
.
Оператор !!
разворачивает символ в выражении, позволяя использовать его как имя переменной в функции filter()
.
Работа с несколькими столбцами: syms()
Если вам нужно работать сразу с несколькими столбцами, то для преобразования списка строк в символы можно использовать функцию syms().
```
library(dplyr)
# Функция для фильтрации нескольких столбцов
filter_multiple <- function(data, col_names) {
cols <- syms(col_names)
data %>%
filter(across(all_of(col_names), ~ !is.na(.)))
}
# Пример данных
data <- tibble(
Area = c('IT', 'Finance', NA),
Date = as.Date(c('2023-01-01', NA, '2023-03-15')),
Amount = c(1000, 2000, NA)
)
# Фильтруем строки, где нет пропусков в нескольких столбцах
filtered_data <- filter_multiple(data, c('Area', 'Date', 'Amount'))
print(filtered_data)
```
Здесь:
syms(col_names)
преобразует вектор строк в список символов.
across()
вместе с all_of()
позволяет удобно применить фильтр ко всем указанным столбцам.
————————————
Использование функций sym()
, syms()
и оператора !!
— это мощный инструмент для написания гибкого и динамического кода в R. Он особенно полезен при работе с большими данными и пакетами вроде dplyr, когда имена столбцов не известны заранее или приходят из пользовательского ввода.
О подобных примерах рассказано в виньетке "Программирование с dplyr".
Добавляемполезные аннотации к части вызова пакетв в своих скриптах
Принято прописывать команды загрузки пакетов в начале вашего скрипта, обычно это выглядит как-то так:
library(rjira)
library(dplyr)
library(tidyr)
library(snakecase)
library(purrr)
library(stringr)
library(bigrquery)
library(googlesheets4)
library(glue)
Это реальный пример загрузки пакетов в одном из моих скриптов. Пакет annotater
добавляет в RStudio Addon, который позволяет добавить описание вызовам пакетов, на данный момент доступно 5 типов аннотаций:
1. Annotate package calls in active file
Добавляет тайтлы пакетов к команде их вызовов. т.е. превратит пример выше в следующий:
```
library(rjira) # Work with Jira API
library(dplyr) # A Grammar of Data Manipulation
library(tidyr) # Tidy Messy Data
library(snakecase) # Convert Strings into any Case
library(purrr) # Functional Programming Tools
library(stringr) # Simple, Consistent Wrappers for Common String Operations
library(bigrquery) # An Interface to Google's 'BigQuery' 'API'
library(googlesheets4) # Access Google Sheets using the Sheets API V4
library(glue) # Interpreted String Literals
```
2. Annotate package repository source in active file
Добавляет информацию о репозитории и версии пакета:
library(rjira) \# [github::selesnow/rjira] v0.0.0.9000
library(dplyr) \# CRAN v1.1.2
library(tidyr) \# CRAN v1.2.1
library(snakecase) \# CRAN v0.11.0
library(purrr) \# CRAN v0.3.4
library(stringr) \# CRAN v1.4.1
library(bigrquery) \# CRAN v1.5.0
library(googlesheets4) \# CRAN v1.0.1
library(glue) \# CRAN v1.6.2
3. Annotate tittles and repository sources in active file
Эта опция добавит одновременно и описание пакета и описание репозитория и его версии
4. Annotate each package's function calls
Пропишет возле вызова пакета список функций. который в текущем скрипте из этого пакета используется.
library(rjira) \# jr\_get\_fields jr\_issue\_search
library(dplyr) \# %>% filter mutate left\_join group\_by row\_number ungroup pull select all\_of coalesce any\_of where rename\_with matches across
library(tidyr) \# %>% all\_of any\_of unnest\_wider matches hoist
library(snakecase) \# to\_snake\_case
library(purrr) \# %>% map\_dfc map
library(stringr) \# %>% str\_remove
library(bigrquery) \# bq\_auth bq\_dataset bq\_dataset\_query bq\_table bq\_table\_upload
library(googlesheets4) \# gs4\_auth range\_read %>%
library(glue) \# glue\_sql
5. Expand metapackages
Разворачивает вызов метапакета, в отдельные вызовы для каждого пакета, который в него входит.
Например вызов library(tidyverse)
будет преобразован в:
\#\#\#\#
library(ggplot2)
library(tibble)
library(tidyr)
library(readr)
library(purrr)
library(dplyr)
library(stringr)
library(forcats)
library(lubridate)
\#\#\#\#
Функционал довольно полезный, особенно если вы планируете разбирать чужой скрипт, в котором используются неизвестные вам пакеты.
Пример работы на изображении к посту.
Ссылка на GitHub пакета annotater
.
Бизнес блог #1
Выжимаю книги до самой сути.
? Реклама - @jaMasha
? Хотите свою книгу? Мы напишем её за вас и сделаем книгу бестселлером. Подробности в боте @Summary_library_bot
? Оставьте след в истории с помощью книги
https://expert-book.pro
Фильмы и сериалы со всей планеты. Мы знаем, что посмотреть, где посмотреть и на что сходить в кино.
Last updated 2 days, 10 hours ago
Все материалы размещены по партнёрской програме ivi.ru | All materials are posted on the partner program ivi.ru
По всем вопросам: @kuzr103
Купить рекламу: https://telega.in/c/k1noxa103
Основной канал: https://t.me/kino_hd2
Last updated 2 weeks, 1 day ago