Вопрос или проблема
В 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
. Давайте рассмотрим, как именно это сделать.
-
Загрузка требуемых библиотек: Убедитесь, что у вас установлен и загружен пакет
dplyr
. -
Загрузка данных: Загрузите ваши данные в dataframe
df
. -
Применение dplyr:
Ваш код на R с использованием dplyr
будет выглядеть следующим образом:
library(dplyr)
test <- df %>%
group_by(ID, GENDER, BIRTHYEAR) %>%
summarize(count = n(), .groups = 'drop') %>%
filter(count > 1)
Объяснение кода
-
group_by(ID, GENDER, BIRTHYEAR)
: Мы группируем данные по полямID
,GENDER
иBIRTHYEAR
. Это аналогично частиGROUP BY
в SQL. -
summarize(count = n(), .groups = 'drop')
: Мы добавляем новую колонкуcount
, которая содержит количество записей для каждой группы. Параметр.groups = 'drop'
позволяет избавиться от группы после выполнения сводной операции. -
filter(count > 1)
: Здесь происходит фильтрация, аналогичнаяHAVING
в SQL, оставляя только те группы, гдеcount
больше 1.
Как обработать данные
Теперь переменная test
будет содержать результаты, основанные на вашей исходной таблице, отфильтрованные по указанным критериям. Если в вашем случае результатов нет (например, 0 строк), то test
будет представлять собой пустой dataframe
, что соответствует поведению вашей начальной SAS-программы.
Важно помнить
- Обязательно используйте соответствующий dataframe (
df
), который содержит ваши данные, заменяя его на фактическое имя вашего набора данных. - Пакет
dplyr
является мощным инструментом для манипуляции данными в R, и его возможности не ограничиваются только группировкой и фильтрацией. Вы можете применять различные функции для трансформации данных, что облегчит и ускорит анализ.
Таким образом, R предоставляет возможности, сравнимые с SAS, и более гибкие в некоторых аспектах. Вы сможете с легкостью адаптировать свои SQL-запросы из SAS к dplyr
в R, расширяя свои навыки в анализе данных.