Поиск…


Вступление

Учитывая объект R, нам может потребоваться отдельный анализ для одной или нескольких частей содержащихся в нем данных. Процесс получения этих частей данных из данного объекта называется subsetting .

замечания

Отсутствующие значения:

Отсутствующие значения ( NA s), используемые в подмножестве с [ return NA с индексом NA

выбирает неизвестный элемент и поэтому возвращает NA в соответствующий элемент.

Тип «по умолчанию» NA является «логическим» ( typeof(NA) ), что означает, что как любой «логический» вектор, используемый в подмножестве, будет перерабатываться в соответствии с длиной подмножества. Таким образом, x[NA] эквивалентно x[as.logical(NA)] который эквивалентен x[rep_len(as.logical(NA), length(x))] и, следовательно, он возвращает отсутствующее значение ( NA ) для каждого элемента x . В качестве примера:

x <- 1:3
x[NA]
## [1] NA NA NA

При индексировании с «числовым» / «целочисленным» NA выбирает один элемент NA (для каждого NA в индексе):

x[as.integer(NA)]
## [1] NA

x[c(NA, 1, NA, NA)]
## [1] NA  1 NA NA

Подстановка за пределы:

Оператор [ с одним аргументом передается, позволяет индексы > length(x) и возвращает NA для атомных векторов или NULL для общих векторов. Напротив, с [[ и когда [ передано больше аргументов (т.е. подмножество вне границ объектов с length(dim(x)) > 2 ), возвращается ошибка:

(1:3)[10]
## [1] NA
(1:3)[[10]]
## Error in (1:3)[[10]] : subscript out of bounds
as.matrix(1:3)[10]
## [1] NA
as.matrix(1:3)[, 10]
## Error in as.matrix(1:3)[, 10] : subscript out of bounds
list(1, 2, 3)[10]
## [[1]]
## NULL
list(1, 2, 3)[[10]]
## Error in list(1, 2, 3)[[10]] : subscript out of bounds

Поведение такое же, когда подмножество с векторами-символами, которые также не соответствуют атрибуту «names» объекта:

c(a = 1, b = 2)["c"]
## <NA> 
##   NA 
list(a = 1, b = 2)["c"]
## <NA>
## NULL

Разделы помощи:

См. « ?Extract для получения дополнительной информации.

Атомные векторы

Атомные векторы (которые исключают списки и выражения, которые также являются векторами) являются подмножествами с использованием оператора [ operator:

# create an example vector
v1 <- c("a", "b", "c", "d")

# select the third element
v1[3]
## [1] "c"

[ Оператор также может принимать вектор в качестве аргумента. Например, чтобы выбрать первый и третий элементы:

v1 <- c("a", "b", "c", "d")

v1[c(1, 3)]
## [1] "a" "c"

Иногда нам может потребоваться опустить конкретное значение из вектора. Это может быть достигнуто с помощью отрицательного знака ( - ) перед индексом этого значения. Например, чтобы опустить первое значение из v1, используйте v1[-1] . Это может быть расширено до нескольких значений прямым способом. Например, v1[-c(1,3)] .

> v1[-1]
[1] "b" "c" "d"
> v1[-c(1,3)]
[1] "b" "d"

В некоторых случаях мы хотели бы знать, особенно, когда длина вектора велика, индекс определенного значения, если он существует:

> v1=="c"
[1] FALSE FALSE  TRUE FALSE
> which(v1=="c")
[1] 3

Если атомный вектор имеет имена (атрибут names ), он может быть подмножеством с использованием символьного вектора имен:

v <- 1:3
names(v) <- c("one", "two", "three")

v
##  one   two three 
##    1     2     3 

v["two"]
## two 
##   2

Оператор [[ также может использоваться для индексирования атомных векторов с различиями в том, что он принимает вектор индексирования с длиной одного и разделяет любые имена:

v[[c(1, 2)]]
## Error in v[[c(1, 2)]] : 
##  attempt to select more than one element in vectorIndex

v[["two"]]
## [1] 2

Векторы также могут быть подмножеством с использованием логического вектора. В отличие от подмножества с числовыми и символьными векторами, логический вектор, используемый для подмножества, должен быть равен длине вектора, элементы которого извлекаются, поэтому, если логический вектор y используется для подмножества x , то есть x[y] , если length(y) < length(x) то y будет переработано в соответствии с length(x) :

v[c(TRUE, FALSE, TRUE)]
##  one three 
##    1     3 

v[c(FALSE, TRUE)]  # recycled to 'c(FALSE, TRUE, FALSE)'
## two 
##   2 

v[TRUE]   # recycled to 'c(TRUE, TRUE, TRUE)'
##  one   two three 
##    1     2     3 

v[FALSE]   # handy to discard elements but save the vector's type and basic structure
## named integer(0)

Списки

Список может быть подмножеством с [ :

l1 <- list(c(1, 2, 3), 'two' = c("a", "b", "c"), list(10, 20))
l1
## [[1]]
## [1] 1 2 3
## 
## $two
## [1] "a" "b" "c"
##
## [[3]]
## [[3]][[1]]
## [1] 10
##
## [[3]][[2]]
## [1] 20

l1[1]
## [[1]]
## [1] 1 2 3

l1['two']
## $two
## [1] "a" "b" "c"

l1[[2]]
## [1] "a" "b" "c"

l1[['two']]
## [1] "a" "b" "c"

Обратите внимание, что результат l1[2] по-прежнему является списком, поскольку [ оператор выбирает элементы списка, возвращая меньший список. [[ Оператор извлекает элементы списка, возвращая объект типа элемента списка).

Элементы могут индексироваться по номеру или символьной строке имени (если оно существует). Несколько элементов могут быть выбраны с помощью [ путем передачи вектора чисел или строк имен. Индексирование с вектором length > 1 в [ и [[ возвращает «список» с указанными элементами и рекурсивное подмножество (если доступно) соответственно :

l1[c(3, 1)]
## [[1]]
## [[1]][[1]]
## [1] 10
## 
## [[1]][[2]]
## [1] 20
## 
## 
## [[2]]
## [1] 1 2 3

По сравнению с:

l1[[c(3, 1)]]
## [1] 10

что эквивалентно:

l1[[3]][[1]]
## [1] 10

Оператор $ позволяет вам выбирать элементы списка исключительно по имени, но в отличие от [ и [[ , не требует кавычек. В качестве инфиксного оператора $ может принимать только одно имя:

l1$two
## [1] "a" "b" "c"

Кроме того, оператор $ допускает частичное сопоставление по умолчанию:

l1$t
## [1] "a" "b" "c"

в отличие от [[ где необходимо указать, разрешено ли частичное совпадение:

l1[["t"]]
## NULL
l1[["t", exact = FALSE]]
## [1] "a" "b" "c"

Параметры options(warnPartialMatchDollar = TRUE) , при возникновении частичного совпадения с $ :

l1$t
## [1] "a" "b" "c"
## Warning message:
## In l1$t : partial match of 't' to 'two'

Матрицы

Для каждого измерения объекта оператор [ operator принимает один аргумент. Векторы имеют один размер и принимают один аргумент. Матрицы и фреймы данных имеют два измерения и принимают два аргумента, заданные как [i, j] где i - строка, а j - столбец. Индексирование начинается с 1.

## a sample matrix
mat <- matrix(1:6, nrow = 2, dimnames = list(c("row1", "row2"), c("col1", "col2", "col3")))

mat
#      col1 col2 col3
# row1    1    3    5
# row2    2    4    6

mat[i,j] - элемент в i строке, j столбец матрицы mat . Например, значение i 2 и значение j 1 задают число во второй строке и первом столбце матрицы. Опускание i или j возвращает все значения в этом измерении.

mat[ , 3]
## row1 row2 
##    5    6 

mat[1, ]
# col1 col2 col3 
#    1    3    5 

Когда матрица имеет имена строк или столбцов (не обязательно), они могут использоваться для подмножества:

mat[ , 'col1']
# row1 row2 
#    1    2 

По умолчанию результат подмножества будет, по возможности, упрощен. Если подмножество имеет только одно измерение, как в приведенных выше примерах, результатом будет одномерный вектор, а не двумерная матрица. Это значение по умолчанию может быть переопределено с аргументом drop = FALSE в [ :

## This selects the first row as a vector
class(mat[1, ])
# [1] "integer"

## Whereas this selects the first row as a 1x3 matrix:
class(mat[1, , drop = F])
# [1] "matrix"

Конечно, размеры нельзя отбрасывать, если сам выбор имеет два измерения:

mat[1:2, 2:3]  ## A 2x2 matrix
#      col2 col3
# row1    3    5
# row2    4    6

Выбор отдельных записей матрицы по их позициям

Также возможно использовать матрицу Nx2 для выбора N отдельных элементов из матрицы (например, как работает система координат). Если вы хотите выделить в векторе записи матрицы в (1st row, 1st column), (1st row, 3rd column), (2nd row, 3rd column), (2nd row, 1st column) это может легко сделать, создав матрицу индексов с этими координатами и используя ее для подмножества матрицы:

mat
#      col1 col2 col3
# row1    1    3    5
# row2    2    4    6

ind = rbind(c(1, 1), c(1, 3), c(2, 3), c(2, 1))
ind
#      [,1] [,2]
# [1,]    1    1
# [2,]    1    3
# [3,]    2    3
# [4,]    2    1

mat[ind]
# [1] 1 5 6 2

В приведенном выше примере 1-й столбец матрицы ind ссылается на строки в mat , второй столбец ind ссылается на столбцы в mat .

Кадры данных

Подстановка кадра данных в меньший кадр данных может быть выполнена так же, как подмножество списка.

> df3 <- data.frame(x = 1:3, y = c("a", "b", "c"), stringsAsFactors = FALSE)

> df3
##   x y
## 1 1 a
## 2 2 b
## 3 3 c

> df3[1]   # Subset a variable by number
##   x
## 1 1
## 2 2
## 3 3

> df3["x"]   # Subset a variable by name 
##   x
## 1 1
## 2 2
## 3 3

> is.data.frame(df3[1])
## TRUE

> is.list(df3[1])
## TRUE

Подсечение кадра данных в вектор столбца может быть выполнено с использованием двойных скобок [[]] или оператора знака доллара $.

> df3[[2]]    # Subset a variable by number using [[ ]]
## [1] "a" "b" "c"

> df3[["y"]]  # Subset a variable by name using [[ ]]
## [1] "a" "b" "c"

> df3$x    # Subset a variable by name using $
## [1] 1 2 3

> typeof(df3$x)
## "integer"

> is.vector(df3$x)
## TRUE

Подмножество данных в виде двумерной матрицы может быть выполнено с использованием термов i и j .

> df3[1, 2]    # Subset row and column by number
## [1] "a"

> df3[1, "y"]  # Subset row by number and column by name
## [1] "a"

> df3[2, ]     # Subset entire row by number  
##   x y
## 2 2 b

> df3[ , 1]    # Subset all first variables 
## [1] 1 2 3

> df3[ , 1, drop = FALSE]
##   x
## 1 1
## 2 2
## 3 3

Примечание. Только data.frame j (столбец) упрощает собственный тип переменной, но подмножество только i возвращает data.frame , так как разные переменные могут иметь разные типы и классы. Установка параметра drop в FALSE поддерживает фрейм данных.

> is.vector(df3[, 2])
## TRUE

> is.data.frame(df3[2, ])
## TRUE

> is.data.frame(df3[, 2, drop = FALSE])
## TRUE

Другие объекты

Операторы [ и [[ являются примитивными функциями, которые являются общими. Это означает, что любой объект в R (в частности isTRUE(is.object(x)) --ie имеет явный атрибут класса), может иметь свое определенное поведение при подмножестве; т.е. имеет свои собственные методы для [ и / или [[ .

Например, это имеет место с объектами «data.frame» ( is.object(iris) ), где [[.data.frame методы [.data.frame и [[.data.frame , и они созданы для отображения как «матричных» и "list" -подобное подмножество. С форсированием ошибки при подмножестве «data.frame» мы видим, что на самом деле функция [.data.frame была вызвана, когда мы просто использовали [ .

iris[invalidArgument, ]
## Error in `[.data.frame`(iris, invalidArgument, ) : 
##   object 'invalidArgument' not found

Без дополнительной информации о текущей теме, пример [ метод:

x = structure(1:5, class = "myClass")
x[c(3, 2, 4)]
## [1] 3 2 4
'[.myClass' = function(x, i) cat(sprintf("We'd expect '%s[%s]' to be returned but this a custom `[` method and should have a `?[.myClass` help page for its behaviour\n", deparse(substitute(x)), deparse(substitute(i))))

x[c(3, 2, 4)]
## We'd expect 'x[c(3, 2, 4)]' to be returned but this a custom `[` method and should have a `?[.myClass` help page for its behaviour
## NULL

Мы можем преодолеть метод отправки [ с использованием эквивалентного не-generic .subset.subset2 для [[ ). Это особенно полезно и эффективно при программировании наших собственных «классов» и избегает unclass(x) например, unclass(x) ) при эффективном вычислении на наших «классах» (избегая отправки методов и копирования объектов):

.subset(x, c(3, 2, 4))
## [1] 3 2 4

Векторное индексирование

В этом примере мы будем использовать вектор:

> x <- 11:20
> x
 [1] 11 12 13 14 15 16 17 18 19 20

R векторы 1-индексируются, поэтому, например, x[1] вернет 11 . Мы также можем извлечь подвектор x , передавая вектор индексов оператору скобки:

> x[c(2,4,6)]
[1] 12 14 16

Если мы передадим вектор отрицательных индексов, R вернет под-вектор с указанными указанными индексами:

> x[c(-1,-3)]
[1] 12 14 15 16 17 18 19 20

Мы также можем передать булевой вектор в оператор скобки, и в этом случае он возвращает подвектор, соответствующий координатам, где вектор индексирования имеет значение TRUE :

> x[c(rep(TRUE,5),rep(FALSE,5))]
[1] 11 12 13 14 15 16

Если вектор индексирования короче длины массива, то он будет повторяться, как в:

> x[c(TRUE,FALSE)]
[1] 11 13 15 17 19
> x[c(TRUE,FALSE,FALSE)]
[1] 11 14 17 20

Операции элементарных матриц

Пусть A и B - две матрицы той же размерности. Операторы + , - , / , * , ^ при использовании с матрицами одинаковой размерности выполняют требуемые операции над соответствующими элементами матриц и возвращают новую матрицу той же размерности. Эти операции обычно называются элементарными операциями.

оператор A op B Имея в виду
+ A + B Добавление соответствующих элементов A и B
- A - B Вычитает элементы из B из соответствующих элементов A
/ A / B Разделяет элементы A на соответствующие элементы B
* A * B Умножает элементы A на соответствующие элементы B
^ A ^ (- 1) Например, дает матрицу, элементы которой являются обратными от A

Для «истинного» умножения матрицы, как видно из линейной алгебры , используйте %*% . Например, умножение A на B: A %*% B Требования к размеру заключаются в том, что ncol() of A является таким же, как nrow() of B

Некоторые функции, используемые с матрицами

функция пример Цель
nrow () nrow (А) определяет количество строк A
Ncol () Ncol (А) определяет количество столбцов A
rownames () rownames (А) выводит имена строк матрицы A
COLNAMES () COLNAMES (А) печатает имена столбцов матрицы A
rowMeans () rowMeans (А) вычисляет средства для каждой строки матрицы A
colMeans () colMeans (А) вычисляет средства каждого столбца матрицы A
upper.tri () upper.tri (А) возвращает вектор, элементы которого являются верхними
треугольная матрица квадратной матрицы A
lower.tri () lower.tri (А) возвращает вектор, элементы которого являются нижними
треугольная матрица квадратной матрицы A
Det () Det (А) приводит к определителю матрицы A
решать() решения (А) приводит к обратному отношению к неособой матрице A
Diag () Diag (A) возвращает диагональную матрицу, чьи недиагностические элементы являются нулями и
диагонали такие же, как и квадратная матрица A
т () т (А) возвращает транспонирование матрицы A
собственный () собственный (А) ретунирует собственные значения и собственные векторы матрицы A
is.matrix () is.matrix (А) возвращает TRUE или FALSE в зависимости от того, является ли A матрицей или нет.
as.matrix () as.matrix (х) создает матрицу из вектора x


Modified text is an extract of the original Stack Overflow Documentation
Лицензировано согласно CC BY-SA 3.0
Не связан с Stack Overflow