在一个语句中创建一个带有名称的数字向量?
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) %>%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
【讨论】:
以上是关于在一个语句中创建一个带有名称的数字向量?的主要内容,如果未能解决你的问题,请参考以下文章