R studio формат даты
Анализ данных, содержащих даты и время, может сопровождаться приличной головной болью. Причин этому может быть несколько:
К счастью, система дат и времени в R такова, что многие из указанных проблем относительно легко преодолеваются. С форматом представления дат и времени в R можно ознакомиться, выполнив команду Sys.time()
Как видим, формат строго иерархичен: сначала идет наболее крупная временная единица - год, потом месяц и день, разделенные дефисом, а затем пробел, час, минуты, секунды и, после еще одного пробела, аббревиатура временной шкалы.
Отдельные элементы из этого результата можно извлечь при помощи функции substr() (от substring - часть строки), указав позиции первого и последнего элементов извлекаемой строки:
то получим время, выраженное в секундах, прошедших с 1 января 1970 г. Это т.н. Unix-время (по названию операционной системы). Второе название этого формата - POSIX. В R имеется два POSIX-класса. Класс POSIXct служит для педставления времени в виде секунд, истекших с 1 января 1970 г. Такой "машинный" формат удобен для включения в таблицы данных. Для человека все же более удобным является представление времени при помощи класса POSIXlt . Объекты этого класса представляют собой списки, включающие такие элементы, как секунды, минуты, часы, дни, месяцы, и годы.
Из списка date далее легко можно извлечь такие содержащиеся в нем элементы, как sec (секунды), min (минуты), hour (часы), mday (день месяца), mon (месяц), year (год), wday (день недели, начиная с воскресенья = 0), yday (день года, начиная с 1 января = 0), и isdst ("is daylight savings time in operation?" - логическая переменная, обозначающая, используется ли режим перехода на "зимнее" и "летнее" время; 1 если TRUE и 0 если FALSE ), например:
Используйте функцию unclass() в сочетании с unlist() для просмотра всего содержимого списка date :
Вычисления с датами и временем
- число + время;
- время - число;
- время1 - время2
- время1 "логический оператор" время2 (в качестве логического оператора могут использоваться == , != , или >= ).
Еще проще разницу между двумя датами можно найти при помощи готовой функции difftime() (от difference - разница, и time - время):
Чтобы извлечь непосредственно количество дней из результата выполнения предыдущей команды используйте функцию as.numeric() :
Функция strptime()
Функция strptime() (от strip - раздевать, оголять, и time - время) позволяет извлекать даты и время из текстовых выражений класса POSIXlt или POSIXct (см. выше). При этом важно верно указать формат (при помощи аргумента format), в котором приведены временные величины. Приняты следующие условные обозначения для формата дат и времени (приведены наиболее часто используемые; детали доступны по команде ?strptime ):
%a сокращенное название для недели (англ. яз.)
%A полное название для недели (англ. яз.)
%b сокращенное название месяца (англ. яз.)
%B полное название месяца (англ. яз.)
%d день месяца (01–31)
%H часы от 00 до 23
%I часы от 01 до 12
%j порядковый номер дня года (001–366)
%m порядковый номер месяца (01–12)
%M минуты (00–59)
%S секунды (00–61, с возможностью добавить "високосную секунду")
%U неделя года (00–53), используя первое вокресенье как первый день первой недели
%w порядковый номер дня недели (0–6, воскресенье - 0)
%W неделя года (00–53), используя первый понедельник как первый день первой недели
Рассмотрим пример. Предположим, у нас имеется текстовый вектор, в котором хрянятся даты в формате программы Microsoft Excel:
Требуется преобразовать эти текстовые выражения в даты формата R. Формат имеющихся Excel-дат таков, что сначала идет день месяца, затем порядковый номер самого месяца и, наконец, год с указанием века. Используя приведенные выше обозначения, принятые в R, этот формат можно представить в виде %d/%m/%Y . Тогда команда для преобразования Excel-дат в R-даты будет выглядеть следующим образом:
Вот еще один пример, в котором год приведен без указания века, а месяцы приведены в виде их сокращенных названий:
--
Основным источником для написания данной статьи послужил раздел "Dates and Times in R" из книги Майкла Кроули (Michael Crawley) "The R Book".
Получить текущую дату в любом языке программирования, операция эквивалентная "Hello world!". Язык R не является исключением.
В этой статье мы разберёмся с тем, как устроена работа с датами в базовом синтаксисе языка R, а также рассмотрим несколько полезных пакетов, расширяющих его возможности при работе с датами:
- lubridate — пакет позволяющий производить арифметические вычисления между датами;
- timeperiodsR — пакет для работы с временными интервалами и их компонентами.
Если вы интересуетесь анализом данных, и в частности языком R, возможно вам будут интересны мои telegram и youtube каналы. Большая часть контента которых посвящена языку R.
Преобразование текста в дату
В базовом R присутствует набор функций для работы с датами. Минус базового синтаксиса заключается в том, что регистр имён и аргументов функций очень разрознен, и практически не имеет логической связи. Тем не менее, базовые функции языка надо знать, поэтому начнём мы именно с них.
Наиболее часто при загрузке данных в R, из csv файлов, или других источников, вы получаете дату в виде текста. Для того, что бы привести этот текст к правильному типу данных используйте функцию as.Date() .
По умолчанию as.Date() принимает дату в двух форматах: ГГГГ-ММ-ДД или ГГГГ/ММ/ДД.
Если в вашем наборе данных даты представлены в каком либо другом формате, для преобразования можно использовать аргумент format .
format принимает в строковом виде операторы обозначающие какой-либо временной интервал и его формат, наиболее часто используемые значения приведены в таблице ниже:
Формат | Описание |
---|---|
%d | Номер дня в месяце |
%a | Аббревиатура названия дня недели |
%A | Полное название дня недели |
%w | Номер дня недели (0-6, где 0 это воскресенье) |
%m | Двухзначное обозначение месяца (01-12) |
%b | Аббревиатура имени месяца (apr, mar, . ) |
%B | Полное название месяца |
%y | Двухзначное обозначение года |
%Y | Четырёхзначное обозначение года |
%j | Номер дня в году (001 — 366) |
%U | Номер недели в году (00 — 53), начало недели Воскресенье |
%W | Номер недели в году (00 — 53), начало недели Понедельник |
Соответственно, "September 26, 2019" это — полное название месяца, число и год. Описать этот формат даты операторами можно так: "%B %d, %Y" .
Где:
- %B — Полное название месяца
- %d — Номер дня в месяце
- %Y — Четырёхзначное обозначение года
При описании формата даты важно включать все доп символы из вашей строки, например тире, запятые, точки, пробелы и так далее. В моём примере, "September 26, 2019", после даты стоит запятая, и в описание формата так же надо ставить запятую: "%B %d, %Y" .
Бывают ситуации, когда вы получаете дату не только не соответствующую стандартным форматам (ГГГГ-ММ-ДД или ГГГГ/ММ/ДД), но ещё и на языке, который отличается от установленного в вашей операционной системе по умолчанию. Например, вы загрузили данные, где дата указана вот в таком виде: "Декабрь 15, 2019 г.". Перед конвертацией этой строки в дату вам необходимо поменять локаль.
Извлечение компонентов даты в базовом R
В базовом R не так много функций позволяющих извлекать какую либо часть даты из объекта класса Date.
Помимо основного класса объектов Date в базовом R есть ещё 2 типа данных которые хранят отметку времени: POSIXlt, POSIXct. Основное отличие этих классов от Date заключается в том, что кроме даты они хранят время.
Функция Sys.time() возвращает текущую дату и время в формате POSIXct. Этот формат по смыслу похож на UNIXTIME, и хранит в себе количество секунд с момента начала эры UNIX (полночь (по UTC) с 31 декабря 1969 года на 1 января 1970).
Класс POSIXlt так же хранит в себе время и дату, и все их компоненты. Поэтому является объектом с более сложной структурой, но из которого легко получить любой компонент даты и времени т.к. по сути POSIXlt это list.
Преобразование числовых и текстовых данных в форматы POSIX* осуществляются функциями as.POSIXct() и as.POSIXlt() . Данные функции имеют небольшой набор аргументов.
- x — Число, строка или объект класса Date, который необходимо преобразовать;
- tz — Часовой пояс, по умолчанию "GMT";
- format — Описание формата даты в которым представлены данные передаваемые в аргумент x;
- origin — Используется только при конвертации числа в POSIX, в этот аргумент необходимо передать объект даты, и времени от которого идёт отсчёт секунд. Как правило, используется для перевода из UNIXTIME.
Если ваши данные о дате и времени представлены в UNIXTIME, то для их конвертации в понятную, читаемую дату используйте следующий пример:
В origin вы можете указать любую временную метку. Например, если в ваших данных дата и время указаны как количество секунд начиная от 15 сентября 2019 года 12:15, то для преобразования их в дату используйте:
lubridate пожалуй самый популярный пакет для работы с датами на языке R. Он предоставляет вам дополнительно ещё три класса.
- durations — длительность, т.е. количество секунд между двумя временными метками;
- periods — периоды позволяют производить вычисления между датами понятными для человека интервалами: днями, месяцами, неделями и так далее;
- intervals — объекты предоставляющие начальный и конечный момент времени.
Установка дополнительных пакетов в языке R осуществляется стандартной функцией install.packages() .
Установка пакета lubridate :
Преобразование текста в дату с помощью lubridate
Функции пакета lubridate значительно упрощают процесс конвертации текста в дату, а так же позволяют вам проводить любые арифметические операции с датами и временем.
Получить текущую дату, или дату и время вам помогут функции today() и now() .
Для преобразования строки в дату в lubridate есть целое семейство функций имена которых состоят всегда из трёх букв, и обозначают последовательность компонентов даты:
Несколько примеров для преобразования строк в даты:
Как видите lubridate значительно более эффективно умеет распознавать описание дат в виде текста, и позволяет вам преобразовывать текст в дату не используя дополнительных операторов для описания формата.
Извлечение компонентов дат с помощью пакета lubridate
Также с помощью lubridate можно получить любой компонент из даты:
Арифметические операции с датами
Но, наиболее важный и основной функционал lubridate заключается в возможности производить различные арифметические операции с датами.
Округление даты осуществляется тремя функциями:
- floor_date — округление к ближайшему прошедшему времени
- ceiling_date — округление к ближайшему будущему времени
- round_date — округление к ближайшему времени
Каждая из этих функций имеет аргумент unit, который позволяет вам указать единицу округления: second, minute, hour, day, week, month, bimonth, quarter, season, halfyear, year
Итак, давайте разберёмся с тем, как получить дату, которая будет через 8 дней после текущей даты и проводить различные другие арифметические вычисления между двумя датами.
timeperiodsR — свежий пакет для работы с датами который был опубликован на CRAN в сентябре 2019 года.
Установка пакета timeperiodsR :
Основное назначение — быстрое определение некоторого временного интервала относительно заданной даты. Например с помощью его функций вы легко можете:
- Получить прошлую неделю, месяц, квартал или год в R.
- Получить заданное количество временных интервалов относительно даты, например прошлые 4 недели.
- Легко извлекать из полученного временного интервала его компоненты: начальную и конечную дату, количество дней попавших в интервал, всю последовательность дат которые в него входят.
Название всех функций пакета timeperiodsR интуитивно понятны, и состоят из двух частей: направление_интервал, где:
- направление в котором необходимо двигаться относительно заданной даты: last_n, previous, this, next, next_n.
- временной интервал для вычисления периода: day, week, month, quarter, year.
- last_n_days()
- last_n_weeks()
- last_n_months()
- last_n_quarters()
- last_n_years()
- previous_week()
- previous_month()
- previous_quarter()
- previous_year()
- this_week()
- this_month()
- this_quarter()
- this_year()
- next_week()
- next_month()
- next_quarter()
- next_year()
- next_n_days()
- next_n_weeks()
- next_n_months()
- next_n_quarters()
- next_n_years()
- custom_period()
Временные интервалы в timeperiodsR
Эти функции полезны в случаях, когда вам необходимо строить отчёты на основе данных за прошлую неделю или месяц. Чтобы получить прошлый месяц воспользуйтесь одноимённой функцией previous_month() :
После чего у вас будет объект prmonth класса tpr, из которого легко можно получить следующие компоненты:
- дату начала периода, в нашем примере это прошлый месяц
- дату завершения периода
- количество дней входящих в период
- последовательность дат входящих в период
Причём получить каждый из компонентов можно разными способами:
Также вы можете получить любой из компонентов используя аргумент part, который присутствует в каждой из функций пакета. Возможные значения: start, end, sequence, length.
Итак, давайте рассмотрим все аргументы доступные в функциях пакета timeperiodsR :
- x — Опорная дата от которой будет вычислять временной период, по умолчанию текущая дата;
- n — Количество интервалов которые будут входить в период, например 3 предыдущие недели;
- part — Какой компонент объекта tpr вам необходимо получить, по умолчанию all ;
- week_start — Аргумент присутствует только в функциях для работы с неделями, и позволяет задать номер дня недели который будет считаться её началом, по умолчанию началом недели является понедельник, но вы можете задать любой с 1 — понедельник по 7 — воскресенье.
Таким образом, вы можете вычислять любой временной период относительно текущей, либо любой другой заданной даты, приведу ещё несколько примеров:
6 октября это воскресенье:
Нам необходим период, который относительно 6 октября возьмёт 3 предыдущие недели. Не включая неделю, в которую входит само 6 октября. Соответственно это период с 9 по 29 сентября.
В этом примере нас интересует месяц, который был 4 месяца назад, если отталкиваться от 16 сентября 2019 года, соответственно это был май 2019 года.
Фильтрация вектора дат с помощью timeperiodsR
Для фильтрации дат в timeperiodsR есть несколько операторов:
- %left_out% — сравнивает два объекта класса tpr, и возвращает значение из левого, которые отсутствуют в правом.
- %left_in% — сравнивает два объекта класса tpr, и возвращает даты из левого объекта которые входят в правый.
- %right_out% — сравнивает два объекта класса tpr, и возвращает значение из правого, которые отсутствуют в левом.
- %right_in% — сравнивает два объекта класса tpr, и возвращает даты из правого объекта которые присутвуют в левом.
У пакета timeperiodsR есть официальный, русскоязычный плейлист на YouTube.
Мы подробно рассмотрели классы объектов которые предназначены в языке R для работы с датами. Также теперь вы умеете проводить над датами арифметические операции, и быстро получать любые временные периоды с помощью пакета timeperiodsR .
Если вам интересен язык R приглашаю вас подписаться на мой телеграмм канал R4marketing, в котором я на ежедневной основе делюсь полезными материалами о применении языка R в решении своих повседневных задач.
На написание данной статьи меня сподвиг следующий топик: В поисках идеального поста, или загадки хабра. Дело в том, что после ознакомления с языком R я крайне искоса смотрю на любые попытки, что-то посчитать в экселе. Но надо признать, что и с R я познакомился лишь неделю назад.
Цель: Собрать средствами языка R данные с любимого HabraHabr'а и провести, собственно то, для чего и был создан язык R, а именно: статистический анализ.
- Как можно использовать R для извлечения данных из Web ресурсов
- Как преобразовывать данные для последующего анализа
- Какие ресурсы крайне рекомендуются к прочтению всем желающим познакомиться с R поближе
Ожидается, что читатель достаточно самостоятелен, чтобы самому ознакомиться с основными конструкциями языка. Для этого как никак лучше подойдут ссылки в конце статьи.
Подготовка
- Rcurl — для работы с сетью. Все кто работал с CURL сразу поймет все открывающиеся возможности.
- XML — пакет для работы с DOM деревом XML документа. Нам понадобится функционал нахождения элементов по xpath
Получаем данные
Чтобы получить DOM объект документа полученного из интернета достаточно выполнить следующие строчки:
Здесь мы использовали поиск элементов и атрибутов с помощью xpath.
Далее крайне рекомендуется сформировать из полученных данных data.frame — это аналог таблиц базы данных. Можно будет делать запросы разного уровня сложности. Иногда диву даешься, как элегантно можно сделать в R ту или иную вещь.
Так же полезно добавить дополнительные поля, которые вычисляются из уже полученных:
На этом, можно сказать, что все данные получены и преобразованы к готовому для анализа формату. Код выше я оформил в виде функции готовой к использованию. В конце статьи вы сможете найти ссылку на исходник.
Но внимательный читатель уже заметил, что таким образом, мы получили данные лишь для одной страницы, чтобы получить для целого ряда. Чтобы получить данные для целого списка страниц была написана следующая функция:
Здесь мы используем системную функцию Sys.sleep, чтобы не устроить случайно хабраэффект самом хабру:)
Данную функцию предлагается использовать следующим образом:
А считываем следующим образом:
Ура! Мы научились получать статистические данные с хабра и сохранять их локально для следующего анализа!
Анализ данных
Этот раздел я оставлю недосказанным. Предлагаю читателю самому поиграться с данными и получить свои долеко идущие выводы. К примеру, попробуйте проанализировать зависимость настроения плюсующих и минусующих в зависимости от дня недели. Приведу лишь 2 интересных вывода, которые я сделал.
Пользователи хабра значительно охотнее плюсуют, чем минусуют.
Действительно есть несколько классов постов
Это утверждение в упомянутом посте использовалось как данность, но я хотел убедиться в этом в действительности. Для этого достаточно посчитать среднюю долю плюсов к общему количеству действий, тоже самое для минусов и разделить второе на первое. Если бы все было однородно, то множество локальных пиков на гистограмме мы не должны наблюдать, однако они там есть.
Как вы можете заметить, есть выраженные пики в районе 0.1, 0.2 и 0.25. Предлагаю читателю самому найти и «назвать» эти классы.
Хочу заметить, что R богата алгоритмами для кластеризации данных, для аппроксимации, для проверки гипотез и т.п.
Полезные ресурсы
Если вы действительно хотите погрузиться в мир R, то рекомендую следующие ссылки. Пожалуйста, поделитесь в комментариях вашими интересными блогами и сайтами на тему R. Есть кто-нибудь пишущий об R на русском?
Считаю, что такие языки как R, haskell, lisp, javascript, python — должен знать каждый уважающий себя программист: если не для работы, то как минимум для расширения кругозора!
Далее тезисно приведены отдельные моменты, которые редко высвечиваются в документации, а также трюки, которые позволяют писать быстрый и контролируемый код.
Совсем краткое резюме для смартфоночиталей: на больших объемах данных используем только POSIXct с дробными долями секунд. Будет хорошо, понятно, быстро.
ISO 8601 Data elements and interchange formats – Information interchange – Representation of dates and times is an international standard covering the exchange of date- and time-related data.
Нестандартный формат даты при инициализации должен специфицироваться специально
Время
В R применяются два базовых типа времени: POSIXct и POSIXlt .
Внешние представления POSIXct и POSIXlt выглядят похожими. А внутренние?
Сразу делаем заключение, что для серьезной работы с данными (более 10 строк с временем), про POSIXlt забываем как про страшный сон. Это сложная структура с безумными накладными расходами.
POSIXct по своей сути является оберткой для unixtimestamp, количество секунд (миллисекунд) с некоей нулевой точки (обычно за 0 полагают 01.01.1970). Делаем ставку в работе именно на него.
Полезный инструмент — online преобразование времени в unixtimestamp:
Работа с долями секунды
Корни вопроса идут от типовой задачи анализа логов. Для быстрых событий недостаточно секундного разрешения и тут появляются вариации. Время в логе может фиксироваться:
- по рекомендациям ISO, с долями секунд в виде дробной части (ISO 8601-2019);
- с какими-нибудь другими разделителями;
- как отдельное поле.
Объекты класса POSIXct могут хранить и проводить вычисления с дробными секундами, но по умолчанию при выводе на печать дробные части округляются из-за чего могут возникнуть надуманные ограничения. Проверяем и смотрим:
Вернемся к логам, сформируем тестовый набор данных и посмотрим на различные варианты работы со временем.
Парсинг данных с миллисекундами.
А что делать, если время может поступать в частично обрезанном формате?
Разрешим вариативность определенной глубины
Пробуем провести конвертацию
Что делать? Вариант, конечно, ужасен, но что-то можно поделать.
Еще пакеты на "посмотреть" и поизучать:
Разность
Периоды
А теперь более сложный пример — добавляем месяцы
Есть выход. Но операции не коммутативны, это надо помнить.
Нюансы временных зон
Работа только с временнЫми значениями
Что делать, если у нас есть только время, а даты не указаны? Не проблема, нам поможет пакет hms . Такие данные представляются как периоды.
Одна из больших засад при работе с временнЫми данными в БД — неизвестность или неполная осведомленность о механике и логике работы конкретных таблиц. Не всегда есть возможность посмотреть запросы по которым они строились или же текст функций.
В современных БД (далее будем подразумевать Clickhouse) время, как правило, хранится как unixtimestamp в UTC. Ну или возможны иные варианты, но все они крутятся вокруг количества единиц времени относительно некоей реперной точки.
Потенциальные сложности и засады:
- При запросе у БД колонки времени под ее капотом может происходить масса метаморфоз. БД сериализует timestamp, при этом могут оказать свое влияние параметры временных зон из БД, ОС, поля, смежного поля, переменных окружения.
- При получении данных на клиентской стороне вмешивается драйвер (серия драйверов и врапперов). При развертывании времени замешивается логика драйверов, параметры локали ОС, языковые и временные параметры среды, значение переменных окружения и отражение лунного света в болоте.
- В поле unixtimestamp разработчики могут помещать отнюдь не UTC время, а московское. Или иное (сюрприз!).
- В БД может быть агрегация и партиционирование по дате, вычисляемой на основании поля timestamp. В силу расхождения в трактовке временных зон, данные за день Х вполне могут уехать в партиции X-1 или X+1 , что необходимо учитывать при построении быстрого запроса к БД.
В общем, вероятность получить предсказуемый результат в любой произвольной среде исполнения близок к 0.
Чтобы избежать этого и параллельно получить еще массу преимуществ достаточно перейти на ручное управление.
Суть заключается в переводе дат в числовой формат на стороне базы и обратное преобразование во время (там, где надо) на стороне клиента. Такое решение не сильно обременительно, зато дает массу преимуществ:
- полный контроль реальных временнЫх меток на всех этапах, включая выявлении косяков разработчиков и специфики настройки БД;
- возможность сверки реально получаемы показателей с ожидаемыми;
- прецизионное управление временными зонами для корректной трактовки;
- корректное преобразование времени в даты (с учетом таймзон);
- схождение суточных агрегатов;
- возможность интеграции дробных долей секунд в единый double ;
- сокращение временнЫх затрат на сериализацию и передачу по сети;
- общее увеличение производительности.
Трюк по экономии памяти и времени исполнения без потери информации
Хелпер для детального анализа занимаемой data.frame памятью
Повторно полезные ссылки по форматам и калькуляторам, необходимым при анализе путей следования дат в ИС и БД
При отображении графиков, подготовке текстов, группировке временных интервалов, преобразовании текста даты и подобное часто требуетя выдать или распознать дату в хитром виде. Ниже ряд подходов и функций.
Привязка к рабочим неделям
Пишем календарные дни в различных локалях. Не зависит от платформы исполнения.
Собственное форматирование дат по осям графиков
Иногда возникает необходимость собственного форматирования меток осей. Ниже пример по созданию такой функции
Простая математика
Создадим тестовый набор записей
Типичный вопрос аналитика: У меня данные хранятся в формате год/месяц/число. Мне не все нужны, а только суббота, как мне отфильтровать?
Пример кода. Не забываем, что ряд функций работает с учетом локали машины на которой выполняется код. И если у вас месяц печатается на русском, то это не гарантирует (если не использовать специальные методы) аналогичное поведение на другой машине или другой ОС.
P.S. Большинство тестов приведены исключительно для примера. Можете запускать на своих машинах, число будут совершенно иными, но характер зависимости и соотношения должен примерно сохраняться.
Таблица данных (data frame) представляет собой объект R, по структуре напоминающий лист электронной таблицы Microsoft Excel. Каждый столбец таблицы является вектором, содержащим данные определенного типа. При этом действует правило, согласно которому все столбцы должны иметь одинаковую длину (собственно, с "точки зрения" R таблица данных является частным случаем списка, в котором все компоненты-векторы имеют одинаковый размер). Часто на практике некоторые значения в таблице отсутствуют, что может быть обусловлено множеством причин: на момент измерения прибор вышел из строя, по невнимательности персонала измерение не было занесено в протокол исследования, испытуемый отказался отвечать на определенный вопрос(ы) в анкете, была утеряна проба, и т.п. Ячейки с такими отсутствующими значениями (missing values) в таблицах данных R не могут быть просто пустыми – иначе столбцы таблицы окажутся разной длины. Для обозначения отсутствующих наблюдений в языке R имеется специальное значение – NA (not available – не доступно).
Таблицы данных – это основной класс объектов R, используемых для хранения данных. Обычно такие таблицы подготавливаются при помощи сторонних приложений (особенно популярна и удобна программа Microsoft Excel) и затем загружаются в среду R. Подробнее об импортировании данных в R рассказано здесь. Тем не менее, небольшую таблицу можно собрать из нескольких векторов средствами самой системы R. Для этого используют функцию data.frame() .
Предположим, у нас есть наблюдения по общей численности мужского ( Male ) и женского ( Female ) населения в трех городах City1 , City2 , и City3 . Представим эти данные в виде одной таблицы с именем CITY . Для начала создадим текстовые векторы с названиями городов ( сity ) и пола ( sex ), а также вектор со значениями численности представителей каждого пола ( number ):
Читайте также: