преобразовать вектор в список - PullRequest
8 голосов
/ 08 декабря 2010

У меня есть такой вектор

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

и я хотел бы создать этот список

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

есть ли способ сделать это в стиле «применить»? Спасибо.

-k

Ответы [ 4 ]

11 голосов
/ 09 декабря 2010

Использование as.list и setNames:

x = c("1", "a","b")
as.list(setNames(rep(as.numeric(x[1]), length(x) - 1), x[-1]))
7 голосов
/ 08 декабря 2010

Как это?

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> 

С благодарностью Гевину за обнаружение более ранней ошибки.

5 голосов
/ 08 декабря 2010

Это не стиль применения, а простая функция для переноса необходимых команд:

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
2 голосов
/ 15 марта 2014

Для полноты, есть более простая однострочная, чтобы сделать это в «применимом» стиле в соответствии с запросом:

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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...