Все ли является вектором в R?

#r #vector

Вопрос:

Я занимался с Пандами на Python, выполняя некоторые манипуляции и регрессии с данными, которые я собрал, и отвечая на такие вопросы, и подумал, что изучение этого вдохновения может помочь моему пониманию.

Я использую учебник learn-R, и после vector и некоторых поисков в SO и в Интернете я пришел к этому:

 # So assigning a value to v will create an atomic vector
# of length one with a type
v <- 1
is.vector(v)  # TRUE
class(v)  # 'numeric'
# But literals are also vectors? These all return TRUE
is.vector(1)
is.vector("string literal")
is.vector(TRUE)
is.vector("c")

# and lists are vectors too
l <- list(1, 2, 3)
is.vector(l)  # TRUE
 

Итак, все ли является вектором в R?

Комментарии:

1. Основные структуры данных R включают в себя: векторы, списки , данные.фрейм и матрицу

2. (@tushaR, я бы обобщил «матрицу»: она имеет только 2 измерения, в то время "array" как может иметь произвольное количество измерений, но в остальном идеально совместима. identical(matrix(1:3, nrow=1), array(1:3, dim=c(1,3))) это правда.)

3. R не имеет скалярного типа данных. Все типы данных являются атомарными или универсальными векторами (списками). Я рекомендую прочитать определение языка: cran.r-project.org/doc/manuals/r-release/…

4. Все в R является объектом. is.vector(df) Возврат FALSE .

5. Функции не являются векторами. Если бы это было так, объекты типа closure могли бы быть заменяемыми. 😉

Ответ №1:

Нет, некоторые вещи не являются векторами в R, но большинство способов, которыми вы хотели бы хранить данные, являются векторами. Проблема в том, что у этого is.vector() есть странное определение: оно не допускает атрибутов. Например,

 x <- 1:3
is.vector(x)
#> [1] TRUE
attr(x, "foo") <- "bar"
x
#> [1] 1 2 3
#> attr(,"foo")
#> [1] "bar"
is.vector(x)
#> [1] FALSE
 

Создано 2021-09-07 пакетом reprex (v2.0.0)

Я бы сказал, что x это все еще вектор даже с атрибутом, но is.vector() функция считает, что объекты с атрибутами не являются векторами. Для нелепого примера: согласно is.vector() , факторы не являются векторами, но вы можете относиться к ним так, как если бы они были:

 x <- factor(letters[1:4])
is.vector(x)
#> [1] FALSE
x
#> [1] a b c d
#> Levels: a b c d
x[2:3]
#> [1] b c
#> Levels: a b c d
 

Создано 2021-09-07 пакетом reprex (v2.0.0)

Поэтому , если мы определяем векторы как объекты, которые могут быть проиндексированы с помощью [] или [[]] , то большинство типов данных (типы, построенные из логических, целых, числовых, сложных, символьных и необработанных, а также списков) являются векторами. В R. нет скаляров таких типов.

С другой стороны, если вы определяете векторы как объекты , для которых is.vector() возвращается TRUE значение, существует множество типов данных, которые не являются векторами: факторы, матрицы, массивы, временные ряды, данные.кадры и т. Д. Так что не делай этого. 🙂

Ваши примеры с использованием литералов работают таким образом, потому что R не обрабатывает литеральные значения каким-либо особым образом. Это просто выражения, которые дают объекты.

Некоторые вещи на самом деле не являются векторами: NULL объект, языковые объекты, такие как имена (например as.name("x") ), среды, функции и т. Д.