R новичок: эквивалент SAS proc sql в R, group by, having, count, повторное объединение сводной статистики

Вопрос или проблема

В SAS я пишу код, который в журнале выглядит так:
2 proc sql;
3 create table test as
4 select
5 ID,
6 GENDER,
7 BIRTHYEAR
8 from
9 libname.dataset
10 group by ID
11 having count(*) > 1
12 ;

ПРИМЕЧАНИЕ: Запрос требует повторного объединения сводной статистики с оригинальными данными.

ПРИМЕЧАНИЕ: Таблица WORK.TEST создана, с 0 строками и 3 столбцами.
13 quit;

Могу ли я сделать что-то подобное в R?
В R Studio я МОГУ выполнить код:
test <- sqlQuery(channel, query=’
select
ID
from
lib.dataset
group by ID
having count(*)=1
‘)

Но когда я пытаюсь выполнить следующий код, я не получаю набор данных, как в SAS:
test <- sqlQuery(channel, query=’
select
ID,
GENDER,
BIRTHYEAR
from
lib.dataset
group by ID
having count(*)=1
‘)

Вместо данных с именами столбцов и 0 строк я просто получаю значение = chr [1:2] 42000 8120 [Microsoft]{ODBC SQL Server Driver]….
Извините, если вопрос не совсем ясен.
Смотрите сообщение для всех деталей.

Вот эквивалент вашего кода SAS на R:
library(dplyr)

df |>
select(ID,GENDER,BIRTHYEAR) |>
group_by(ID) |>
summarize(count = n())

Где df — это ваш датафрейм. select, group_by и summarize — это все глаголы dplyr.
Вы можете узнать больше о пакете R dplyr здесь: https://dplyr.tidyverse.org/

Ответ или решение

Чтобы потрясти мир анализа данных, важно находить эквиваленты между языками программирования. В вашем случае, вы ищете эквивалент SQL кода из SAS на языке R. Мы рассмотрим способ реализации аналогичного запроса, а также коснемся некоторых нюансов, связанных с использованием библиотеки dplyr в R.

Задача: Ресемплирование статистики и фильтрация данных

Вы хотите создать таблицу на основе данных из набора, где выполняется группировка по ID, подсчет количества записей и фильтрация выборки с использованием условия HAVING.

Код SAS

Ваш оригинальный код на SAS:

proc sql;
create table test as
select
ID,
GENDER,
BIRTHYEAR
from
libname.dataset
group by ID
having count(*) > 1
;
quit;

Аналогичный код в R с использованием dplyr

На языке R можно достичь такого же результата с помощью пакета dplyr. Давайте рассмотрим, как именно это сделать.

  1. Загрузка требуемых библиотек: Убедитесь, что у вас установлен и загружен пакет dplyr.

  2. Загрузка данных: Загрузите ваши данные в dataframe df.

  3. Применение dplyr:

Ваш код на R с использованием dplyr будет выглядеть следующим образом:

library(dplyr)

test <- df %>%
  group_by(ID, GENDER, BIRTHYEAR) %>%
  summarize(count = n(), .groups = 'drop') %>%
  filter(count > 1)

Объяснение кода

  1. group_by(ID, GENDER, BIRTHYEAR): Мы группируем данные по полям ID, GENDER и BIRTHYEAR. Это аналогично части GROUP BY в SQL.

  2. summarize(count = n(), .groups = 'drop'): Мы добавляем новую колонку count, которая содержит количество записей для каждой группы. Параметр .groups = 'drop' позволяет избавиться от группы после выполнения сводной операции.

  3. filter(count > 1): Здесь происходит фильтрация, аналогичная HAVING в SQL, оставляя только те группы, где count больше 1.

Как обработать данные

Теперь переменная test будет содержать результаты, основанные на вашей исходной таблице, отфильтрованные по указанным критериям. Если в вашем случае результатов нет (например, 0 строк), то test будет представлять собой пустой dataframe, что соответствует поведению вашей начальной SAS-программы.

Важно помнить

  • Обязательно используйте соответствующий dataframe (df), который содержит ваши данные, заменяя его на фактическое имя вашего набора данных.
  • Пакет dplyr является мощным инструментом для манипуляции данными в R, и его возможности не ограничиваются только группировкой и фильтрацией. Вы можете применять различные функции для трансформации данных, что облегчит и ускорит анализ.

Таким образом, R предоставляет возможности, сравнимые с SAS, и более гибкие в некоторых аспектах. Вы сможете с легкостью адаптировать свои SQL-запросы из SAS к dplyr в R, расширяя свои навыки в анализе данных.

Оцените материал
Добавить комментарий

Капча загружается...