2013-11-02 3 views
0

Для большинства базовых структур данных в R можно одновременно назначать значения и имена. Например:Назначение имен вектору при создании экземпляра

l <- list(a=1:3, b=4) 
m <- matrix(1:9, 3, 3, dimnames=list(letters[1:3], letters[1:3])) 
d <- data.frame(a=1:5, b=letters[1:5], c=rnorm(5)) 

Однако для векторов это разные. Насколько я знаю, единственный способ дать names к вектору впоследствии:

v <- 1:3 
names(v) <- letters[1:3] 

c не имеют аргументы, которые позволяют указать names в конкретизации.
Попытка сделать это при назначении (например, в lists или data.frames) также не работает:

v <- c("a"=1) # error 

Можно ли назначить и данные, а также имена вектора в то же время?

+6

Но ты не пробовал как вы делали, когда вы создали список и data.frame: 'v <- c (a = 1)' или 'v <- setNames (1," a ")' –

+2

, какую ошибку вы получаете при запуске 'c ("а" = 1) '? – GSee

+0

Оказывается, я попробовал 'c (буквы [1: 3] = 1: 3)', и это дало ошибку, но 'c (" a "= 1)' works (и расширения 'c (" a "= 1 , "b" = 2, ...) '. Но ответ @JoshuaUlrich гораздо удобнее –

ответ

3

Как ответили в комментариях Joshua Ульриха, правильный ответ заключается в использовании setNames:

v <- setNames(1:2, letters[1:2]) 

Я тоже неправильно в моем первоначальном поиске ион: v <- c("a"=1) работает, однако удлинение его довольно утомительно: v <- c("a"=1, "b"=2, ...).

-1

Я не уверен, если я правильно понял вас, но может быть, это то, что вы ищете:

for (n in 1:6) assign(x=letters[n], value=n) 

производит:

> a 
[1] 1 
> b 
[1] 2 
> c 
[1] 3 
> d 
[1] 4 
> e 
[1] 5 
> f 
[1] 6 
+1

Это не то, что он хочет. Он хотел бы создать именованный вектор. – Roland

+0

Хорошо, тогда ответ @JoshuaUlrich: 'sapply (c: 1: 6), setNames (x, буквы [x])) ' – albifrons

+1

Нет, ответ' setNames (1: 6, letters [1: 6]) '. – Roland

2

Другой (уродливее) решением является использование structure()

v <- structure(1:3, .Names = c("a", "b", "c")) 

(я здесь, глядя на результаты dput(v) после делая это трудный путь.)

Смежные вопросы