#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")
), среды, функции и т. Д.