R Language
переменные
Поиск…
Переменные, структуры данных и основные операции
В R объекты данных обрабатываются с использованием именованных структур данных. Имена объектов можно назвать «переменными», хотя этот термин не имеет определенного значения в официальной документации R. Названия R чувствительны к регистру и могут содержать буквенно-цифровые символы ( az
, Az
, 0-9
), точку / период ( .
) И подчеркивание ( _
). Чтобы создать имена для структур данных, мы должны следовать следующим правилам:
Имена, начинающиеся с цифры или символа подчеркивания (например,
1a
) или имен, которые являются действительными численными выражениями (например,.11
), или имена с тире ('-') или пробелы могут использоваться только при их цитировании:`1a`
и`.11`
. Имена будут напечатаны с обратными окнами:list( '.11' ="a") #$`.11` #[1] "a"
Все другие комбинации буквенно-цифровых символов, точек и подчеркивания могут использоваться свободно, где ссылка с обратными тактами или без них указывает на один и тот же объект.
Имена, которые начинаются с
.
считаются именами систем и не всегда отображаются с помощью функцииls()
.
Нет ограничений на количество символов в имени переменной.
Некоторые примеры допустимых имен объектов являются: foobar
, foo.bar
, foo_bar
, .foobar
В R переменным присваиваются значения с помощью оператора infix-присваивания <-
. Оператор =
также может использоваться для назначения значений переменным, однако его правильное использование - это сопоставление значений с именами параметров в вызовах функций. Обратите внимание, что исключение пробелов вокруг операторов может создать путаницу для пользователей. Выражение a<-1
анализируется как назначение ( a <- 1
), а не как логическое сравнение ( a < -1
).
> foo <- 42
> fooEquals = 43
Поэтому foo
присваивается значение 42
. Набрав foo
в консоли, fooEquals
42
, а при вводе fooEquals
будет выводиться 43
.
> foo
[1] 42
> fooEquals
[1] 43
Следующая команда присваивает значение переменной x
и печатает значение одновременно:
> (x <- 5)
[1] 5
# actually two function calls: first one to `<-`; second one to the `()`-function
> is.function(`(`)
[1] TRUE # Often used in R help page examples for its side-effect of printing.
Также возможно назначать переменные с помощью ->
.
> 5 -> x
> x
[1] 5
>
Типы структур данных
Не существует скалярных типов данных в R. Векторы длины-один действуют подобно скалярам.
- Векторы: Атомные векторы должны быть последовательностью объектов одного класса: последовательность чисел или последовательность логических последовательностей или последовательность символов.
v <- c(2, 3, 7, 10)
,v2 <- c("a", "b", "c")
- оба вектора. - Матрицы: матрица чисел, логическая или символьная.
a <- matrix(data = c(1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12), nrow = 4, ncol = 3, byrow = F)
. Подобно векторам, матрица должна быть сделана из элементов одного класса. Для извлечения элементов из матрицы должны быть указаны строки и столбцы:a[1,2]
возвращает[1] 5
который является элементом в первой строке, второй столбец. - Списки: объединение разных элементов
mylist <- list (course = 'stat', date = '04/07/2009', num_isc = 7, num_cons = 6, num_mat = as.character(c(45020, 45679, 46789, 43126, 42345, 47568, 45674)), results = c(30, 19, 29, NA, 25, 26 ,27) )
. Извлечение элементов из списка может быть выполнено по имени (если список указан) или по индексу. В данном примереmylist$results
иmylist[[6]]
получает тот же самый элемент. Предупреждение: если вы попробуетеmylist[6]
, R не даст вам ошибку, но извлечет результат в виде списка. Хотяmylist[[6]][2]
разрешен (он дает вам 19),mylist[6][2]
дает вам ошибку. - data.frame: объект с столбцами, которые являются векторами равной длины, но (возможно) разными типами. Они не являются матрицами.
exam <- data.frame(matr = as.character(c(45020, 45679, 46789, 43126, 42345, 47568, 45674)), res_S = c(30, 19, 29, NA, 25, 26, 27), res_O = c(3, 3, 1, NA, 3, 2, NA), res_TOT = c(30,22,30,NA,28,28,27))
. Столбцы могут быть прочитаны по имениexam$matr
,exam[, 'matr']
или по индексномуexam[1]
,exam[,1]
. Строки также можно читать поexam['rowname', ]
по имениexam['rowname', ]
или индексномуexam[1,]
. Dataframes на самом деле представляют собой только списки с определенной структурой (атрибуты rownames-attribute и равные длины)
Общие операции и некоторые предостерегающие советы
Операции по умолчанию выполняются по элементам. См. ?Syntax
для правил приоритета оператора. Большинство операторов (и могут выполнять другие функции в базе R) имеют правила утилизации, которые допускают аргументы неравной длины. Учитывая эти объекты:
Примеры объектов
> a <- 1
> b <- 2
> c <- c(2,3,4)
> d <- c(10,10,10)
> e <- c(1,2,3,4)
> f <- 1:6
> W <- cbind(1:4,5:8,9:12)
> Z <- rbind(rep(0,3),1:3,rep(10,3),c(4,7,1))
Некоторые векторные операции
> a+b # scalar + scalar
[1] 3
> c+d # vector + vector
[1] 12 13 14
> a*b # scalar * scalar
[1] 2
> c*d # vector * vector (componentwise!)
[1] 20 30 40
> c+a # vector + scalar
[1] 3 4 5
> c^2 #
[1] 4 9 16
> exp(c)
[1] 7.389056 20.085537 54.598150
Некоторые предупреждения о работе в векторе!
> c+e # warning but.. no errors, since recycling is assumed to be desired.
[1] 3 5 7 6
Warning message:
In c + e : longer object length is not a multiple of shorter object length
R суммирует то, что он может, а затем повторно использует более короткий вектор, чтобы заполнить пробелы ... Предупреждение было дано только потому, что два вектора имеют длины, которые не являются точно кратными. c + f # никакого предупреждения.
Некоторые операции с матрицами Предупреждение!
> Z+W # matrix + matrix #(componentwise)
> Z*W # matrix* matrix#(Standard product is always componentwise)
Для умножения матрицы: V% *% W
> W + a # matrix+ scalar is still componentwise
[,1] [,2] [,3]
[1,] 2 6 10
[2,] 3 7 11
[3,] 4 8 12
[4,] 5 9 13
> W + c # matrix + vector... : no warnings and R does the operation in a column-wise manner
[,1] [,2] [,3]
[1,] 3 8 13
[2,] 5 10 12
[3,] 7 9 14
[4,] 6 11 16
«Частные» переменные
Ведущая точка в имени переменной или функции в R обычно используется для обозначения того, что переменная или функция должны быть скрыты.
Итак, объявив следующие переменные
> foo <- 'foo'
> .foo <- 'bar'
И затем, используя функцию ls
для отображения объектов, будет отображаться только первый объект.
> ls()
[1] "foo"
Однако при передаче all.names = TRUE
в функцию будет отображаться «частная» переменная
> ls(all.names = TRUE)
[1] ".foo" "foo"