将向量转换为列表。

8
我有一个向量,就像这样:
 c("1", "a","b")

我希望你能帮我创建这个列表

list("a"=1,"b"=1)

有一种以“apply”风格来完成的方法吗?谢谢。-k

嗨 Khanh -- 一个值,两个标签?看起来很奇怪。 - Dirk Eddelbuettel
我需要一个快速查找表,就像哈希表一样。在这种情况下,“a”和“b”是网络中的节点,1是它们的社区ID。这是否高效? - knguyen
4个回答

12

使用 as.listsetNames:

x = c("1", "a","b")
as.list(setNames(rep(as.numeric(x[1]), length(x) - 1), x[-1]))

2
由于我在寻找将向量转换为命名列表的更一般情况的解决方案时发现了这个问题,所以我想补充一下,如果您不介意名称与内容相同,也可以使用以下方法:as.list(setNames(x,x)) - user5359531

7
像这样吗?
R> kn <- c("1", "a", "b")
R> nl <- vector(mode="list", length=length(kn)-1)
R> names(nl) <- kn[-1]
R> nl <- lapply(nl, function(x) kn[1])
R> nl
$a
[1] "1"

$b
[1] "1"

R> 

感谢Gavin发现之前的错误。


@Dirk:kn没有任何名称,lapply步骤也不会覆盖nl,因此在此之前设置名称并不会使它们保留下来。 - Gavin Simpson
错误,不,你是完全正确的。已经修复、重新运行和编辑了。感谢你发现了这个问题。 - Dirk Eddelbuettel
用下面的代码替换:names(nl) <- kn[-1]。谢谢。 - knguyen
在匿名函数中仍需要 as.numeric(kn[1]) - 这与@Joshua Ulrich指出的我的答案存在相同的问题。 - Gavin Simpson
即使加上额外的 as.numeric(),你的解决方案在 @knguyen 提出的问题上仍然比我的快得多。 - Gavin Simpson

5
这不是一个应用样式,而是一个简单的函数,用于包装所需的命令,代码如下:
makeList <- function(vec) {
    len <- length(vec[-1])
    out <- as.list(rep(as.numeric(vec[1]), len))
    names(out) <- as.character(vec[-1])
    out
}

使用您的向量,它会给出:
> vec <- c("1", "a","b")
> makeList(vec)
$a
[1] 1

$b
[1] 1

1
可能需要将“1”转换为数字形式,可以使用as.numeric函数。 - Joshua Ulrich
@Joshua;哎呀!发现得好。 - Gavin Simpson

2
为了完整性,这里有一个更简单的一行代码,可以按照请求以“apply”样式执行它:
as.list(sapply(x[-1],function(y) as.double(x[1])))

虽然不是最快的选择,但它足够好以回答这个问题。通过不必要地简化为向量,可以实现显著的加速:
    library(microbenchmark)
    microbenchmark(times=20, 
               Charles=as.list(setNames(rep(as.numeric(x[1]), length(x) - 1), x[-1])),
               Gavin=makeList(x),
               Anon=sapply(x[-1],function(y) as.double(x[1]),simplify=FALSE)
)

Unit: microseconds
    expr    min      lq median      uq    max neval
 Charles 10.868 11.7735 11.774 12.3775 55.848    20
   Gavin 12.075 12.6795 13.132 13.8870 26.867    20
    Anon  6.643  7.0950  7.548  8.1520 17.811    20

使用sapply(..., simplify=FALSE)代替as.list(sapply(...)) - Matthew Lundberg
没有简化=F,我们将会得到相同(Charles,Anon)=FALSE的结果,这不是我想要的。有了简化=F,你的建议可以进一步提高速度——我已经更新了我的答案。谢谢。 - andrekos

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接