在一个语句中创建带有名称的数字矢量?


71

我正在尝试将函数参数的默认值设置为命名数字。有没有一种方法可以在一个语句中创建一个?我检查了“数字”和“向量”,但事实并非如此。也许我可以在一个语句中转换/强制转换矩阵或data.frame并获得相同的结果?明确地说,我正在尝试一次完成以下操作:

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

Answers:


19

矢量元素的命名约定与列表相同:

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

啊! 我从未尝试过这种表示法,因为我认为它仅限于列表和data.frames
SFun28'9

1
该答案包含@joran的答案,但由于它隐藏在这里,因此很难说:function(params= ...) { body }
The Red Pea

我认为我们对问题的理解有所不同。我以为问题是关于函数参数的。joran认为问题在于命名列表或向量项目。这是一种区别,没有太大区别,因为函数参数是列表的一种。
IRTFM

实际上我不明白这个答案:也许有一个具体的案例body以及如何使用它newfunc来获取所请求的数据结构会有所帮助。
U. Windl

我回答了这个问题(它不要求用例,而仅要求语法上的可能性。)如果您需要此用于特定的操作,则应该发布一个包含数据的问题并说明您需要做什么。
IRTFM


61

...作为旁注,该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"

52

怎么样:

 c(A = 1, B = 2)
A B 
1 2 

再加上一个最简单的方法来创建命名向量。
Karl Baker

5

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

最简单的如果您希望名称与向量相同,即c(1,2) %>%set_names(.)
CrunchyTopping

0

要扩展@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  
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.