В чем разница между созданием вектора с помощью c() и as.vector?

#r #vector

#r #вектор

Вопрос:

Я хотел бы создать вектор, числовой вектор, который должен быть конкретным в R Studio. Я познакомился с этими двумя, читая некоторые вопросы о R. Я совершенно не понимаю разницы между ними. Что мне следует использовать или что лучше?

  mydata <- c(1,2,3,4,5)
 

и

  mydata <- as.vector(c(1,2,3,4,5))
 

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

1. ?as.vector Для получения дополнительной информации попробуйте ввести в консоль. Это больше для принудительной передачи данных из другого типа данных в вектор. is.vector(c(1,2,3,4,5)) возвращает TRUE, поэтому нет необходимости включать as.vector

Ответ №1:

Нет необходимости вызывать as.vector , as c() создаст вектор с заданными записями. as.vector(c(1,2,3)) попытался бы принудить вектор к вектору и ничего не сделал бы в этом случае.

Вы можете видеть, что оба имеют одинаковый тип с str() , например

 > str(c(1,2,3))
 num [1:3] 1 2 3
> str(as.vector(c(1,2,3)))
 num [1:3] 1 2 3
 

Оба будут вычисляться в числовой вектор.

Возможно, руководство сможет объяснить больше. Вы можете просмотреть текст справки для (большинства) функций, добавив a ? к имени функции.

 ?c
 

Это универсальная функция, которая объединяет свои аргументы.

Метод по умолчанию объединяет свои аргументы для формирования вектора. Все аргументы приводятся к общему типу, который является типом возвращаемого значения, и все атрибуты, кроме имен, удаляются.

Тип вектора будет зависеть от вводимых вами данных. Если вы предоставляете c() числовые значения, это будет числовой вектор, и то же самое для строк. Обратите внимание, что смешивание типов в векторах может иметь нежелательные последствия, поскольку вектор может иметь только один тип.

 ?as.vector
 

as.vector , универсальный, пытается принудительно перевести свой аргумент в вектор
режима mode (по умолчанию используется принудительное переключение в тот векторный режим, который наиболее
удобен): если результат является атомарным, все атрибуты удаляются.

Обратите внимание, что я написал «в этом случае» для as.vector(c(1,2,3)) . Если бы у вас был именованный вектор, вызов as.vector() удалил бы имена, например

 > vec = c("abc" = 2, "def" = 3)
> vec
abc def 
  2   3 
> as.vector(vec)
[1] 2 3
 

Обратите внимание, что имена удалены.

Ответ №2:

Проверьте результат с dput помощью, если сомневаетесь:

 dput( c(1,2,3,4,5) )
dput( as.vector(c(1,2,3,4,5) ))
 

Это дает вам R-код, необходимый для их воссоздания. Они должны получиться идентичными.

as.vector превращает свой первый аргумент в вектор и предлагает дополнительные функциональные возможности с mode помощью аргумента. c объединяет несколько аргументов, приводя их к общему типу. В руководствах есть примеры и дополнительная документация ?c и ?as.vector

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

1. Спасибо. Я пробовал? функция для обоих, но я не могу четко понять, что она говорит. Но мне это как-то понятно.

Ответ №3:

Основное различие заключается в атрибуте names .

На страницах справки help('as.vector') мой акцент:

as.vector , универсальный, пытается принудительно перевести свой аргумент в вектор режима mode (по умолчанию используется принудительное переключение в тот векторный режим, который наиболее удобен): если результат является атомарным, все атрибуты удаляются.

и help('c') , мой акцент:

Метод по умолчанию объединяет свои аргументы для формирования вектора. Все аргументы приводятся к общему типу, который является типом возвращаемого значения, и все атрибуты, кроме имен, удаляются.

 mydata <- setNames(c(1,2,3,4,5), letters[1:5])

c(mydata)
#a b c d e 
#1 2 3 4 5 

as.vector(mydata)
#[1] 1 2 3 4 5