Создать числовой вектор с именами в одном выражении? - PullRequest
55 голосов
/ 24 сентября 2011

Я пытаюсь установить значение по умолчанию для параметра функции на именованное число.Есть ли способ создать один в одном утверждении?Я проверил «числовой» и «векторный», но это не так.Может быть, я могу преобразовать / привести матрицу или data.frame и достичь того же результата в одном выражении?Чтобы было ясно, я пытаюсь сделать следующее в одном кадре:

test = c( 1 , 2 )
names( test ) = c( "A" , "B" )

Ответы [ 6 ]

75 голосов
/ 15 марта 2014

Для этого предназначена функция setNames().Как описано в Advanced R и ?setNames:

test <- setNames(c(1, 2), c("A", "B"))
56 голосов
/ 24 сентября 2011

... в качестве примечания, функция structure позволяет вам установить ВСЕ атрибуты, а не только имена:

structure(1:10, names=letters[1:10], foo="bar", class="myclass")

, которые будут производить

 a  b  c  d  e  f  g  h  i  j 
 1  2  3  4  5  6  7  8  9 10 
attr(,"foo")
[1] "bar"
attr(,"class")
[1] "myclass"
44 голосов
/ 24 сентября 2011

Как насчет:

 c(A = 1, B = 2)
A B 
1 2 
20 голосов
/ 24 сентября 2011

Соглашение для именования векторных элементов такое же, как и для списков:

newfunc <- function(A=1, B=2) { body}  # the parameters are an 'alist' with two items

Если вместо этого вы хотите, чтобы это был параметр с именованным вектором (функция, которая будет обрабатывать аргументы, предоставленныеapply):

newfunc <- function(params =c(A=1, B=2) ) { body} # a vector wtih two elements

Если вместо этого вы хотите, чтобы этот параметр был именованным списком:

newfunc <- function(params =list(A=1, B=2) ) { body} 
    # a single parameter (with two elements in a list structure
4 голосов
/ 18 октября 2017

magrittr предлагает хорошее и чистое решение.

result = c(1,2) %>% set_names(c("A", "B"))
print(result)
A B 
1 2

Вы также можете использовать его для преобразования data.frames в векторы.

df = data.frame(value=1:10, label=letters[1:10])
vec = extract2(df, 'value') %>% set_names(df$label)
vec
 a  b  c  d  e  f  g  h  i  j 
 1  2  3  4  5  6  7  8  9 10
df
    value label
 1      1     a
 2      2     b
 3      3     c
 4      4     d
 5      5     e
 6      6     f
 7      7     g
 8      8     h
 9      9     i
 10    10     j
0 голосов
/ 16 октября 2018

Чтобы развернуть ответ @ joran (я не смог заставить его правильно отформатировать как комментарий): Если именованный вектор назначен переменной, доступ к значениям A и B осуществляется посредством поднабора с использованием функции [ , Используйте имена для подмножества вектора так же, как вы можете использовать индексный номер для подмножества:

my_vector = c(A = 1, B = 2)    
my_vector["A"] # subset by name  
# A  
# 1  
my_vector[1] # subset by index  
# A  
# 1  
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...