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

Posted

技术标签:

【中文标题】在一个语句中创建一个带有名称的数字向量?【英文标题】:Create a numeric vector with names in one statement? 【发布时间】:2011-11-24 00:36:49 【问题描述】:

我正在尝试将函数参数的默认值设置为命名数字。有没有办法在单个语句中创建一个?我检查了 ?numeric 和 ?vector 但似乎并非如此。也许我可以转换/强制矩阵或 data.frame 并在一个语句中实现相同的结果?需要明确的是,我正在尝试一次性完成以下操作:

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

【问题讨论】:

【参考方案1】:

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

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 此答案包含来自@joran 的答案,但很难说,因为它隐藏在此处:function(params= ...) body 我认为我们阅读问题的方式不同。我认为问题是关于函数参数的。 joran 认为问题是关于命名列表或矢量项目。这是一种没有太大区别的区别,因为函数参数是一种列表。 其实我不明白这个答案:也许body 的具体案例以及如何使用newfunc 来获取请求的数据结构会有所帮助。 我回答了这个问题(它没有询问用例,而只是询问了句法的可能性。)如果你需要这个来执行特定的操作,应该发布一个带有数据的问题并说出什么你需要完成。【参考方案2】:

怎么样:

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

【讨论】:

另外一个是创建命名向量的最直接方法。 也可以使用引号将字符串作为名称【参考方案3】:

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

【讨论】:

【参考方案4】:

setNames() 函数就是为此目的而设计的。如Advanced R 和?setNames 中所述:

test <- setNames(c(1, 2), c("A", "B"))

【讨论】:

【参考方案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) %&gt;%set_names(.)【参考方案6】:

扩展@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  

【讨论】:

以上是关于在一个语句中创建一个带有名称的数字向量?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用for语句在python中创建数千个变量

带有 IF 语句的向量函数的 MATLAB 返回

带有类实例的堆栈溢出异常

R从字符向量输入名称到函数公式语句

如何在 R 中创建一个长度为零的数字向量

ACCESS里如何用SQL语句创建数据库和表