2010-12-08 3 views
7

У меня есть вектор, как этотпреобразования вектора в список

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

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

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

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

-k

+0

Hi Khanh - одно значение, две метки? Это странно. – 2010-12-08 18:22:42

+0

Мне нужен быстрый поиск, как хэш-таблица. В этом случае «a» и «b» являются узлами в сети, а 1 - их идентификатором сообщества. Это эффективно? – knguyen 2010-12-08 18:44:58

ответ

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 для пятнистости ранней ошибки.

+0

@Dirk: `kn` не имеет имен, и не будет ли` lapply` переписывать `nl` таким образом, чтобы имена, прежде чем он не заставит их встать? – 2010-12-08 18:31:44

+0

Я буквально скопировал то, что работало в моей оболочке. – 2010-12-08 18:37:18

+0

Эрр, нет, ты был совершенно прав. Исправлено, повторно запущено и отредактировано. Спасибо, что заметили это. – 2010-12-08 18:45:50

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 
10

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

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

Для полноты, это упрощенная однострочная линия, чтобы сделать это в приложении LY»стиль в соответствии с просьбой:

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 
Смежные вопросы