Автор канала Алексей Селезнёв, руководитель отдела аналитики в Netpeak, автор R пакетов: ryandexdirect, rfacebookstat и др. В канале публикуются статьи, доклады, новости, заметки по языку R.
separate_*().
Так вот, это семейство функций получило 2 новых, очень полезных аргумента:
● too_few - Что делать, если значение разделится на слишком маленькое к-во частей?
- "error" - вызвать ошибку (дефолтное значение).
- "debug" - добавляет дополнительные столбцы к выходным данным, чтобы помочь вам найти и решить основную проблему:
- x_ok - показывает, можно ли разделить столбец, как вы просили
- x_pieces - сообщает вам фактическое количество частей
- x_remainder - показывает вам все, что осталось после разделения.
- "align_start" - добавляет NA в конце до нужной длины.
- "align_end" - (только для separate_wider_delim()) добавляя NA в начале, чтобы заполнить до нужной длины.
● too_many - Что делать, если значение разделится на слишком большое к-во частей?
- "error" - вызвать ошибку (дефолтное значение).
- "debug" - добавляет дополнительные столбцы к выходным данным, чтобы помочь вам найти и решить основную проблему
- "drop" - отбрасывает лишние части.
- "merge" - (только для separate_wider_delim() )объединит дополнительные части.
Пример:
library(tidyr)
# тестовые данные
df <- tibble(
id = 1:3,
x = c("a", "a-b", "a-b-c")
)
# запускаем процесс отладки
df |> separate_wider_delim(
x,
delim = "-",
names = c("x", "y"),
too_few = "debug",
too_many = "debug"
)
# A tibble: 3 × 6
id x y x_ok x_pieces x_remainder
<int> <chr> <chr> <lgl> <int> <chr>
1 1 a NA FALSE 1 ""
2 2 a-b b TRUE 2 ""
3 3 a-b-c b FALSE 3 "-c"
Итак, мы запросили разделение столбца x на 2 новых столбца x и y, но после разбиения через - у нас получается, что в первой строке будет всего один элемент, а в третей 3. Соответственно x_ok выводит FALSE для 1ой и 3ей строк, x_piecesпоказывается конечное количество частей, соответственно 1-2-3, а в столбце
x_remainderмы видим лишнюю часть третей строки, которая останется после разбиения, с используемыми нами параметрами. Информацию из дополнительных столбцов можно использовать либо для того, что бы исправить проблему. либо для того что бы изменить параметры разделения столбца. Давайте попробуем изменить значения аргументов
too_few и too_many так, что бы в случае когда частей недостаточно (строка 1), то мы добавим NA значение для достижения необходимого к-ва частей (too_few="align_start"), а когда частей больше, чем указанное нами к-во столбцов (стока 3), удалим лишние (too_many = "drop").
df |>
separate_wider_delim(
x,
delim = "-",
names = c("a", "b"),
too_few = "align_start",
too_many = "drop"
)
# A tibble: 3 × 3
id a b
<int> <chr> <chr>
1 1 a NA
2 2 a b
3 3 a b
Ссылки:
- Текст является частичным переводом статьи "tidyr 1.3.0"
#заметки_по_Rextract(), separate(), и separate_rows(). Новые функции имеют более согласованные имена, аргументы, производительность и в целом обеспечивают новый подход к решению проблемы разделения одной текстовой ячейки на части.
Функции для разбиения текста на новые столбцы:
● separate_wider_delim() - Разделить с помощью разделителя (ex separate(sep = string))
● separate_wider_position() - Разделить по положению (ex separate(sep = integer vector))
● separate_wider_regex() - Разделить с помощью регулярного выражения (ex extract())
Функции для разбиения текста на новые строки:
● separate_longer_delim() - Разделить с помощью разделителя (ex separate_rows())
● separate_longer_position() - Разделить по положению (ранее аналога не было )
Пример:
Для примера мы будет использовать набор данных о переписи населения, получить этот набор можно с помощью пакета tidycensus.
# тестовые данные vt_census <- tidycensus::get_decennial( geography = "block", state = "VT", county = "Washington", variables = "P1_001N", year = 2020 )Столбец GEOID состоит из 4ёх компонентов: 2-значного идентификатора штата, 3-значного идентификатора округа, 6-значного идентификатора участка и 4-значного идентификатора квартала. Зная это мы можем разделить этот столбец на отдельные столбцы по позиции:
# разбиваем столбец GEOID на 4 компонента по позиции
vt_census |>
select(GEOID) |>
separate_wider_position(
GEOID,
widths = c(state = 2, county = 3, tract = 6, block = 4)
)
Столбец name содержит туже информацию но в текстовом виде, где каждый компонент разделен запятой. разделить данный столбец можно двумя способами, самый простой - использовать separate_wider_delim().
# разбиваем столбец names на компоненты по разделителю
vt_census |>
select(NAME) |>
separate_wider_delim(
NAME,
delim = ", ",
names = c("block", "block_group", "tract", "county", "state")
)
Столбец name мы разбили, но там осталось много лишней, ненужной информации, в каждой ячейке дублируются слова (Block, Block Group, Census Tract и т.д.). Этого можно избежать, если использовать не разбиение по разделителю, а извлечение с помощью регулярных выражений и функцию separate_wider_regex():
# избавляемся от мусора с помощью разбивки через регулярные выражения
vt_census |>
select(NAME) |>
separate_wider_regex(
NAME,
patterns = c(
"Block ", block = "\\d+", ", ",
"Block Group ", block_group = "\\d+", ", ",
"Census Tract ", tract = "\\d+.\\d+", ", ",
county = "[^,]+", ", ",
state = ".*"
)
)
Все приведённые выше примеры были направлены на использование wider функций, т.е. значение одного столбца разделяли на несколько новых столбцов, но иногда нам необходимо из значений одной ячейки получить несколько новых строк, разбив её каким то методом.
# тестовые данные
df_delim <- tibble(
id = 1:3,
x = c("a", "a-b", "a-b-c")
)
df <- tibble(
id = 1:3,
x = c("ab", "def", "")
)
# разбивка на строки по разделителю
df |> separate_longer_delim(x, delim = "-")
# разбивка на строки по позиции
df %>% separate_longer_position(x, 1)
Ссылки:
- Текст является частичным переводом статьи "tidyr 1.3.0"
#заметки_по_Rpackagefinder предназначен для поиска пакетов на CRAN. Поиск осуществляется по имени, заголовку и описанию пакета.
Аргумент display позволяет отображать результаты поиска пакета в консоли "console", или области просмотра в HTML формате "browser".
Пример поиска пакетов:
Например, для поиска пакетов по мета регрессии можно использовать следующую команду.
findPackage(c("meta", "regression"), "and", display = 'console')
Поиск пакетов по пользовательскому набору полей:
Функция exploreFields() позволяет искать пакету по указанному запросу указав пользовательский набор полей (свойств) пакета, по умолчанию осуществляется поиск по полям, аналогичным функции findPackage(), т.е. c("Name", "Description", "LongDescription").
Например, найти пакеты, в разработке которых каким то образом участвовал Хедли можно следующим образом:
exploreFields("Hadley", c("Maintainer", "Authors@R", "Author"), "or", "like")
Просмотр детальной информации о пакете:
Для просмотра более детальной информации о каком либо пакете используйте функцию packageDetails().
packageDetails("ggplot2")
Просмотр новых пакетов на CRAN:
Так же вы можете получить список новых пакетов, добавленных в CRAN за указанное количество предыдущих дней.
whatsNew(last.days = 3)
Так же пакет packagefinder предоставляет аддон для RStudio.
Смотрите так же:
- Как понять к какому пакету относится функция
Ссылки:
- Шпаргалка по пакету packagefinder
- README
#заметки_по_Rsqldf, который последний раз обновлялся ещё в далёком 2017 году. На смену устаревшему пакету пришел новый - tidyquery.
Данный пакет содержит всего 2 функции:
● query() - реализует манипуляцию данными с помощью SQL запросов
● show_dplyr() - транслирует ваш SQL запрос в dplyr код
Пример манипуляции данными с помощью query():
library(tidyquery)
library(nycflights13)
library(dplyr)
query(
" SELECT origin, dest,
COUNT(flight) AS num_flts,
round(SUM(seats)) AS num_seats,
round(AVG(arr_delay)) AS avg_delay
FROM flights f LEFT OUTER JOIN planes p
ON f.tailnum = p.tailnum
WHERE distance BETWEEN 200 AND 300
AND air_time IS NOT NULL
GROUP BY origin, dest
HAVING num_flts > 3000
ORDER BY num_seats DESC, avg_delay ASC
LIMIT 2;"
)
#> # A tibble: 2 × 5
#> origin dest num_flts num_seats avg_delay
#> <chr> <chr> <int> <dbl> <dbl>
#> 1 LGA DCA 4468 712643 6
#> 2 EWR BOS 5247 611192 5
Если в запросе вы используете всего одну таблицу, то можно передать её в качестве первого аргумента функции query(), и в тексте запроса опустить блок FROM.
airports %>%
query("SELECT name, lat, lon ORDER BY lat DESC LIMIT 5")
Пример трансляции SQL запроса в dplyr код с помощью show_dplyr():
show_dplyr(
" SELECT manufacturer,
COUNT(*) AS num_planes
FROM planes
WHERE engine = 'Turbo-fan'
GROUP BY manufacturer
ORDER BY num_planes DESC;"
)
#> planes %>%
#> filter(engine == "Turbo-fan") %>%
#> group_by(manufacturer) %>%
#> summarise(num_planes = dplyr::n()) %>%
#> ungroup() %>%
#> arrange(dplyr::desc(num_planes))
Ссылки:
- примеры кода взяты из README
#заметки_по_R