将矢量转换为列表

时间:2010-12-08 18:21:32

标签: r

我有这样的矢量

 c("1", "a","b")

我想创建此列表

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

有没有办法以“申请”的方式做到这一点?感谢。

-k

4 个答案:

答案 0 :(得分:11)

使用as.listsetNames

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

答案 1 :(得分: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提前发现 错误。

答案 2 :(得分: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

答案 3 :(得分:2)

为了完整起见,有一个更简单的单行代码可以在&#34; apply&#34;所要求的风格:

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