Сегодня мы продолжим работать с таблицами, и давайте загрузим таблицу с прошлой лекции. Давайте загрузим ее по ссылке (так тоже можно):
dat <- read.csv("http://math-info.hse.ru/f/2018-19/comm-math/marketing.csv")
При работе с базами данных необходимо удалить пропущенные значения (или правильно заполнить - кто умеет), потому что иначе мы не сможем полноценно работать с базой (многие функции не работают при наличии NAs, а у некоторых необходимо указывать дополнительный аргумент - учитывать NA или нет).
dat <- na.omit(dat)
Если мы хотим обратиться к конкретной переменной и рассматривать ее как вектор элементов, нужно использовать символ $
.
dat$Promotion # номер рекламной кампании
## [1] 3 3 3 3 2 2 2 2 1 1 1 2 2 2 2 2 2 3 3 3 3 1 1 1 1 2 2 2 2 1 1 1 1 2 2
## [36] 2 2 3 3 3 3 1 1 1 1 1 1 1 1 1 1 1 1 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3
## [71] 3 3 3 3 3 3 1 1 1 1 3 3 3 3 2 2 2 2 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 1 1
## [106] 1 1 1 1 1 1 2 2 2 2 3 3 3 2 2 2 2 1 1 1 1 2 2 2 2 3 3 3 3 3 3 3 1 1 1
## [141] 1 2 2 2 2 1 1 1 1 2 2 2 1 1 1 1 2 2 2 3 3 3 1 1 1 1 1 1 1 2 2 2 1 1 1
## [176] 1 2 2 2 2 2 2 2 1 1 1 1 3 3 3 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 3
## [211] 3 3 3 2 2 2 2 2 2 2 2 1 1 1 1 3 3 3 3 1 1 1 2 2 2 2 3 3 3 3 3 3 3 3 3
## [246] 3 2 2 2 2 2 2 2 2 1 1 1 1 2 2 2 2 2 2 2 2 2 2 2 3 3 3 3 1 1 1 1 2 2 2
## [281] 2 3 3 3 3 1 1 1 1 1 1 1 1 1 1 1 1 3 3 3 3 3 3 3 3 3 3 3 3 2 2 2 2 3 3
## [316] 3 3 3 3 3 3 3 3 3 3 2 2 2 2 1 1 1 1 1 1 1 1 1 1 1 1 3 3 3 3 3 3 3 3 1
## [351] 1 1 1 2 2 2 2 2 2 2 2 3 3 3 3 1 1 1 1 1 1 1 1 1 1 1 1 3 3 3 3 3 3 3 3
## [386] 1 1 1 1 2 2 2 2 2 2 2 2 3 3 3 3 1 1 1 1 3 3 3 3 1 1 1 1 2 2 2 2 3 3 3
## [421] 3 1 1 1 1 3 3 3 3 3 3 3 3 2 2 2 2 3 3 3 3 3 3 3 3 1 1 1 1 2 2 2 2 1 1
## [456] 1 1 3 3 3 3 2 2 2 2 3 3 3 3 2 2 2 2 2 2 2 2 2 2 2 2 1 1 1 1 1 1 1 1 2
## [491] 2 2 2 2 2 2 2 1 1 1 1 2 2 2 2 1 1 1 1 2 2 2 2 3 3 3 3 1 1 1 1 1 1 1 1
## [526] 2 2 2 2
Attach и detach
Мы можем “закрепить” базу данных с помощью команды attach, чтобы обращаться к переменным более простым способом:
attach(dat) # заодно покажет, какие переменные есть
head(Promotion) # имя переменной как есть, без $
## [1] 3 3 3 3 2 2
Однако это не всегда удобно, особенно если приходится работать с несколькими базами одновременно (наложение переменных с одинаковыми именами, проблемы с редактированием и прочее).
detach(dat) # возвращаем обратно
Допустим, мы хотим добавить в базу переменную Campaign, которая будет содержать индекс рекламной кампании, но сохраненный как фактор (factor). Для этого нужно через $ задать имя новой переменной и присвоить ей значение:
dat$Campaign <- factor(dat$Promotion)
#View(dat)
Часто при работе с данными возникает необходимость выбрать несколько переменных или определенную группу наблюдений и анализировать их отдельно - чтобы не загружать каждый раз огромную базу с ненужными показателями.
Можем выбрать несколько переменных (столбцов) и сохранить их в другую базу:
dat[2:4] # 2 и 4 - порядковые номера столбцов, от 2 до 4
Получится маленькая база из трех переменных.
И сохраним ее как новую базу dat1
:
dat1 <- dat[2:4]
#View(dat1)
Если выбираем столбцы не подряд, обязательно их номера нужно оформить в виде вектора:
dat[c(1, 3)] # не просто dat[1, 3]
В противном случае получится совсем не то:
dat[1, 3]
## [1] 1
Это «совсем не то» связано с тем, что, когда мы указываем в квадратных скобках числа через запятую, R воспринимает первое число как номер строки, второе число - как номер столбца (как в матрицах - сначала строка, потом столбец). Можем посмотреть на исходную базу и убедиться в этом:
#View(dat)
Но таким образом мы можем выбирать строки (наблюдения):
dat[, 1:3] # берем все наблюдения (строки), первые 3 переменные (столбцы)
Или столбцы:
dat[1:4, ] # берем первые 4 наблюдения (строки), все переменные (столбцы)
Фильтрация по условиям
Если хотим отобрать из базы определенные наблюдения, это тоже можно сделать с помощью subset()
(«фильтры»). Например, хотим выбрать данные за первую неделю:
sub_educ <- subset(dat, Week == 1)
#View(sub_educ)
Для указания нескольких условий опять потребуются логические операторы:
y <- subset(dat, Week == 1 & MarketSize == "Medium") # несколько условий
#View(y)
Конечно, можем отбирать наблюдения и переменные одновременно:
z <- subset(dat, Week == 1 & MarketSize == "Medium", select = c(MarketID, LocationID, AgeOfStore))
#View(z)
Чтобы удалить переменные, можно действовать двумя способами:
удалить их из базы
оставить все остальные переменные в базе
По смыслу это одно и то же. И то, и другое чаще всего осуществляется с помощью функции subset()
.
Допустим, мы хотим выбрать переменные MarketID
и SalesInThousands
и сохранить их в новую базу:
dat1 <- subset(dat, select = c(MarketID, SalesInThousands)) # указываем имя базы, оставляем Educ и Female
#View(dat)
А теперь хотим оставить все, кроме переменной Week
:
dat2 <- subset(dat, select = -Week) # перед ней стоит минус
#View(dat1)