R: https://cloud.r-project.org/
RStudio: https://www.rstudio.com/products/rstudio/download/#download
Рассмотрите кнопки и вкладки RStudio
Организуйте окна RStudio.
Создайте новый (пустой) R скрипт.
Назначьте рабочую папку данного проекта setwd()
[set working directory]
setwd("/Users/maksimrudnev/Teaching/R2021")
Проверьте, сработала ли предыдущая команда, запустив getwd()
[get working directory]
Рабочее пространство (Environment) - часть оперативной памяти, которая хранит объекты R в текущей сессии.
Рабочая папка (working directory)- это папка на компьютере, в которой сохраняется рабочее пространство, откуда по умолчанию считываются и куда записываются файлы.
1+2
.justnumber
и припишите ему значение 25. Посмотрите, что изменилось во вкладке Environment.
c
. Все текстовые значения берутся в кавычки. Сохраните этот вектор как объект R.rm
.> [1] 3
> [1] "a" "bla" "bla" "blo" "blu"
+
. Посмотрите на результат.> [1] 6 7 8 9 10
> [1] 11 13 15 17 19 16 18 20 22 24
Для индексирования используются квадратные скобки и порядковый номер элемента. Например: vectorA[2]
вернет второй элемент вектора.
Проиндексируйте последний созданный вектор, чтобы был возвращен его
c()
)Примените к этому вектору функции sort()
и order()
. В чем разница между результатами?
Отсортируйте вектор в обратном порядке, изменив значение аргумента decreasing
в функции sort()
.
Проиндексируйте последний созданный вектор, чтобы были возвращены с первого по пятый элементы.
Векторы могут содержать имена каждого из элементов. Имена также могут использоваться для индексирования.
named.vector
, чтобы вернуть элемент под названием "vtoroy"
.Номинальные переменные - дискретные значения с ограниченным числом вариантов.
# эксплицитно
myfactor <- factor(c("a", "a", "b", "b", "a", "b"),
levels = c("b", "a")
)
# или автоматически
myfactor <- factor(c("a", "a", "b", "b", "a", "b"))
myfactor
> [1] a a b b a b
> Levels: a b
Как создавать логические переменные – нужно что-то с чем-то сравнить.
==
равно, эквивалентно; !=
(не равно); а также <
, >
.Логические выражения могут быть сложнее, чем одно сравнение. Для этого используются булевы операторы.
!x
[не x] обратное значение (если TRUE, станет FALSE и наоборот)x & y
Логическое И. И x
, и y
являются TRUE. Если один из них FALSE, то возвращаемые значения FALSE.x | y
Логическое ИЛИ. Если x
или y
является TRUE, то возвращаемое значение будет TRUE.fifty
и объект twenty
и присвойте им значения 50 и 20.==
.!=
[не равно] и >
.>
.> [1] FALSE
> [1] TRUE
> [1] TRUE
> [1] FALSE FALSE FALSE FALSE FALSE TRUE TRUE TRUE TRUE TRUE
Создайте data.frame с двумя переменными, одна из которых числовая (от 5 до 1), вторая – фактор с любыми значениями.
Создайте новую переменную в этом data.frame, которая имеет текстовое значение donda
для всех случаев.
more.than.three
, которая принимала бы значения TRUE
когда первая переменная больше 3.плоская.таблица[строки, колонки]
Например по номеру строки или переменной:
mydata[1, 1]
Или по имени переменной
mydata[1, "idno"]
Если нужны все значения одной переменной, значения для строк пропускаем, но при этом оставляем запятую, чтобы обозначить, что речь идет о колонках, а не о строках:
mydata[, "idno"]
или более коротко с использованием знака $
для обозначения колонки (переменной)
mydata$idno
mydata[1, 1]
mydata[4, 3]
mydata[, 2]
mydata[2, ]
mydata[-1, ]
mydata[, -1]
mydata[, c(1, 3)]
mydata[, "more.than.three"]
mydata$more.than.three
mydata[mydata$more.than.three, ]
-1
)?Отберите из массива третьи значения первой и второй переменных тремя способами:
:
,c()
.Отберите из массива строки, в которых первая переменная принимает значение меньше 3 не создавая при этом новой переменной.
order()
и правила индексирования.Данные можно просматривать функцией View()
, но если таблицу нужно экспортировать подойдут пакеты knitr
и kableExtra
a <- data.frame(one = 1:5, two = 5:1)
library(knitr) # подгружаем необходимые библиотеки
library(kableExtra)
tab1 <- kable(a) # оформляем data.frame в таблицу
kable_styling(tab1) # выводим таблицу на экран (дополнительно можно настроить опции вывода таблицы)
one | two |
---|---|
1 | 5 |
2 | 4 |
3 | 3 |
4 | 2 |
5 | 1 |
knitr
и kableExtra
install.packages
library
foreign
во вкладке Packages и найдите функцию, которая может импортировать данные SPSS.mydata
.mydata <- найденная.вами.функция(
file = ... , # путь к файлу данных
use.value.labels = ... , # нужно ли использовать ярлыки?
use.missings = ..., # включать ли пропущенные значения?
to.data.frame = ... # сформировать из данных data.frame?
)
mydata1 <- read.spss(
file= "data/ESS7e02_1.sav", # путь к файлу данных
use.value.labels = TRUE, # нужно ли использовать ярлыки/метки в качестве значений?
use.missings = TRUE, # включать ли пропущенные значения?
to.data.frame = TRUE # сформировать из данных data.frame?
)
use.value.labels
, use.missings
и to.data.frame
- попробуйте выяснить, что они означают.str()
.use.value.labels
на FALSE
и посмотрите, как изменился результат. В дальнейшем используйте именно этот заново считанный массив.mydata <- read.spss(
file = "data/ESS7e02_1.sav",
use.value.labels = FALSE, # значение этого аргумента изменилось
use.missings = TRUE,
to.data.frame = TRUE
)
str(mydata, list.len = 6)
> 'data.frame': 40185 obs. of 601 variables:
> $ name : chr "ESS7e02_1 " "ESS7e02_1 " "ESS7e02_1 " "ESS7e02_1 " ...
> $ essround: num 7 7 7 7 7 7 7 7 7 7 ...
> $ edition : chr "2.1" "2.1" "2.1" "2.1" ...
> $ proddate: chr "01.12.2016" "01.12.2016" "01.12.2016" "01.12.2016" ...
> $ idno : num 1 2 3 4 5 6 7 13 14 21 ...
> $ cntry : chr "AT" "AT" "AT" "AT" ...
> ..- attr(*, "value.labels")= Named chr [1:21] "SI " "SE " "PT " "PL " ...
> .. ..- attr(*, "names")= chr [1:21] "Slovenia" "Sweden" "Portugal" "Poland" ...
> [list output truncated]
> - attr(*, "variable.labels")= Named chr [1:601] "Title of dataset" "ESS round" "Edition" "Production date" ...
> ..- attr(*, "names")= chr [1:601] "name" "essround" "edition" "proddate" ...
> - attr(*, "codepage")= int 1252
В разных ситуациях различные способы индексирования полезны. Существует много способов: через квадратные скобки (см. выше), базовый R subset()
, filter()
из пакета dplyr
, функция ifelse()
и т.д.
cntry
используя функцию class()
cntry
с помощью функции table()
.Belgium
, используя логические значения как указатель строк. Для этого предварительно нужно создать логическую переменную, которая принимает значение TRUE
когда переменная cntry
равна значению BE
(код Бельгии).gndr
) со значением 1 и стране (cntry
) Бельгии.str()
.Belgium
переменную idno
.agea
, gndr
, domicil
, tvtot
и polintr
.colnames()
.Новые переменные можно добавлять напрямую приписывая им значения. Например,
Belgium$ones <- 1 # создаст константу, т.е. 1 для всех респондентов.
Belgium$female <- Belgium$gndr == 2 # создаст логическую переменную.
agea
) и год опроса (2014) и запишите его в новую переменную.Belgium
.Переменная polintr
(интерес к политике) имеет обратную кодировку (1 = Very interested, 4 = Not at all interested). Перевернем ее кодировку, чтобы было удобнее интерпретировать результаты.
# сначала создается переменная состоящая из пропущенных значений NA
Belgium$polintr.recoded <- NA
# затем эта новая переменная наполняется с помощью индексирования по старой переменной и приписывания новых значений
Belgium$polintr.recoded[ Belgium$polintr == 4 ] <- 1
Belgium$polintr.recoded[ Belgium$polintr == 3 ] <- 2
Belgium$polintr.recoded[ Belgium$polintr == 2 ] <- 3
Belgium$polintr.recoded[ Belgium$polintr == 1 ] <- 4
# проверим результат
table(Belgium$polintr.recoded, Belgium$polintr)
>
> 1 2 3 4
> 1 0 0 0 348
> 2 0 0 578 0
> 3 0 655 0 0
> 4 188 0 0 0
car
car
.domicil
из numeric в класс переменных factor, т.е. в номинальную переменную под названием, например, big.city
с тремя уровнями - большой город (1), окраины или маленький город (2 и 3), село или ферма (4 и 5).table
) исходной переменной и перекодированной.library(car) # Запускаем пакет
Belgium$big.city <- Recode(
var = Belgium$domicil, # Переменная, которую нужно перекодировать.
recodes = # Перекодировка в формате {входящее значение = исходящее значение}
" 1 = 'Большой город';
c(2,3) = 'Окраина и небольшой город';
c(4,5) = 'Село';
else=NA
",
as.factor=TRUE # Сохранить ли переменную как factor, т.е. номинальную?
)
table(Belgium$big.city)
>
> Большой город Окраина и небольшой город Село
> 232 618 919
foreign
# 1. Сначала найдем нужные переменные
var.labels <- attr(mydata, "variable.labels")
var.labels[1:10]
> name
> "Title of dataset"
> essround
> "ESS round"
> edition
> "Edition"
> proddate
> "Production date"
> idno
> "Respondent's identification number"
> cntry
> "Country"
> tvtot
> "TV watching, total time on average weekday"
> tvpol
> "TV watching, news/politics/current affairs on average weekday"
> ppltrst
> "Most people can be trusted or you can't be too careful"
> pplfair
> "Most people try to take advantage of you, or try to be fair"
> [1] "Title of dataset"
> [2] "ESS round"
> [3] "Edition"
> [4] "Production date"
> [5] "Respondent's identification number"
> [6] "Country"
> [7] "TV watching, total time on average weekday"
> [8] "TV watching, news/politics/current affairs on average weekday"
> [9] "Most people can be trusted or you can't be too careful"
> [10] "Most people try to take advantage of you, or try to be fair"
# 2. затем можно смотреть на кодировку внутри каждой из переменных
attr(mydata$gndr, "value.labels")
> Female Male
> "2" "1"
haven
> [1] "Country"
> United Kingdom Belgium Germany Estonia Ireland Sweden Switzerland
> "GB" "BE" "DE" "EE" "IE" "SE" "CH"
> Finland Slovenia Denmark Israel Netherlands Poland Norway
> "FI" "SI" "DK" "IL" "NL" "PL" "NO"
> France Spain Austria Lithuania Portugal Hungary Czech Republic
> "FR" "ES" "AT" "LT" "PT" "HU" "CZ"
> attr(mydat1$cntry, "labels")
> United Kingdom GB
> Belgium BE
> Germany DE
> Estonia EE
> Ireland IE
> Sweden SE
> Switzerland CH
> Finland FI
> Slovenia SI
> Denmark DK
> Israel IL
> Netherlands NL
> Poland PL
> Norway NO
> France FR
> Spain ES
> Austria AT
> Lithuania LT
> Portugal PT
> Hungary HU
> Czech Republic CZ
Полезная функция, которая автоматически извлекает ярлыки/метки значений и переменных:
labels_haven <- function(data, n) {
lapply(data, function(x) {
if(!is.null(attr(x, "labels"))) {
val.tab = data.frame(values=attr(x, "labels"))
} else {
val.tab = data.frame(NA, NA)
}
list(Variable.label = attr(x, "label"),
values = val.tab)
})[n]
}
labels_haven(mydat1, 10:11)
> $pplfair
> $pplfair$Variable.label
> [1] "Most people try to take advantage of you, or try to be fair"
>
> $pplfair$values
> values
> Most people try to take advantage of me 0
> 1 1
> 2 2
> 3 3
> 4 4
> 5 5
> 6 6
> 7 7
> 8 8
> 9 9
> Most people try to be fair 10
> Refusal 77
> Don't know 88
> No answer 99
>
>
> $pplhlp
> $pplhlp$Variable.label
> [1] "Most of the time people helpful or mostly looking out for themselves"
>
> $pplhlp$values
> values
> People mostly look out for themselves 0
> 1 1
> 2 2
> 3 3
> 4 4
> 5 5
> 6 6
> 7 7
> 8 8
> 9 9
> People mostly try to be helpful 10
> Refusal 77
> Don't know 88
> No answer 99
vote
в используемых данных.vote
в фактор с осмысленными категориями вместо чисел.Подробнее в лекции 2
NA
– “Not Available”.is.na()
возвращает логические значения TRUE когда значения аргумента являются пропущенными NA
.TRUE
) и 0 (FALSE
).na.omit()
исключает из данных все строки/значения в которых есть NA
.TRUE
когда значения переменной vote
являются пропущенными.vote
?vote
, gndr
и agea
, удалив из него строки с пропущенными значениями. Сколько строк в итоге осталось? А сколько было удалено? Какая переменная из этих трех содержит больше всего пропущенных значений?В данных 8 раунда ESS найдите переменные, содержащие информацию о здоровье, счастье и частоте молитв. Сделайте подмассив, содержащий эти три переменные и только тех респондентов, которые родились в 2000 году или позже и проживают в России. Перекодируйте все переменные так, чтобы бóльшие их значения соответствовали бóльшей выраженности признака (а не наоборот). Удалите все строки с пропущенными значениями. Отсортируйте итоговые данные по счастью и экспортируйте в красиво оформленном виде, чтобы таблицу можно было скопировать в Word.
Дополнительно – постройте точечный график (функция plot(x, y)
), описывающий взаимосвязь между счастьем и здоровьем на этом подмассиве.