获取列表元素名称的一致向量

时间:2011-12-08 16:27:07

标签: r

没有名称的列表为其名称返回NULL:

> names(list(1,2,3))
NULL

但添加一个命名的东西,突然名称具有列表的长度:

> names(list(1,2,3,a=4))
[1] ""  ""  ""  "a"

因为现在这是命名列表。我想要的是一个函数,rnames说,将任何列表放入命名列表中,这样:

rnames(list(1,2,3)) == c("","","")
identical(rnames(list()), character(0))
length(rnames(foo)) == length(foo) # for all foo

和以下,无论如何都是names()所做的:

rnames(list(1,2,3,a=3)) == c("","","","a")
rnames(list(a=1,b=1)) == c("a","b")

我目前的hacky方法是在列表中添加一个命名的东西,获取名称,然后将其删除:

rnames = function(l){names(c(monkey=1,l))[-1]}

但有更好/正确的方法吗?

3 个答案:

答案 0 :(得分:5)

感觉稍微清晰的方法是为列表指定名称:

x <- list(1,2,3)
names(x) <- rep("", length(x))
names(x)
[1] "" "" ""

将其转换为函数:

rnames <- function(x){
  if(is.null(names(x))) names(x) <- rep("", length(x))
  return(x)
}

测试用例:

x1 <- rnames(list(1,2,3))
x2 <- rnames(list(1,2,3,a=3))
x3 <- rnames(list(a=1,b=1))

names(x1)
[1] "" "" ""

names(x2)
[1] ""  ""  ""  "a"

names(x3)
[1] "a" "b"

答案 1 :(得分:2)

这样的事情怎么样?

rnames <- function(x) {
    if(is.null(names(x)))
      character(length(x))
    else
      names(x)
}

它处理list()而没有名称案件;如果已有名字,它就不会做任何事情。

答案 2 :(得分:1)

名称位于名为... names:

的属性中
> lis2 <- list("a", "b")
> attributes(lis2)
NULL

> if(is.null(names(lis2)) ) {names(lis2) <- 
                         vector(mode="character", length=length(lis2))}
> lis2
[[1]]
[1] "a"

[[2]]
[1] "b"

> names(lis2)
[1] "" ""

> attributes(lis2)
$names
[1] "" ""