2010-12-08 33 views
7

Bubir vektörü bir listeye dönüştür

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

gibi bir vektör var ve bu listeyi oluşturmak istiyorum

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

bir "uygulama" stilinde bunu yapmanın bir yolu var mı? Teşekkürler.

-k

+0

Hi Khanh - bir değer, iki etiket? Bu tuhaf görünüyor. –

+0

Karma bir tablo gibi hızlı bir bakışa ihtiyacım var. Bu durumda, "a" ve "b" bir ağdaki düğümlerdir ve 1 tanesi topluluk kimliğidir. Verimli mi? – knguyen

cevap

7

Bunu beğendiniz mi? önceki hata tespit için Gavin şeref ile

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> 

.

+0

@Dirk: 'kn' herhangi bir isme sahip değildir ve' lapply' adımı 'nl'nin üzerine yazılmayacak, bu yüzden adlarını sopa yapmadan yapmayacaksınız? –

+0

Tam anlamıyla kabuğumda çalıştım. –

+0

Err, hayır, sen çok haklıydın. Düzeltildi, yeniden çalıştırıldı ve düzenlendi. Bunu gördüğünüz için teşekkürler. Bunun yerine –

5

Bir stil uygulamak değil, ancak basit bir fonksiyon gerekli komutları sarılmasıdır:

makeList <- function(vec) { 
    len <- length(vec[-1]) 
    out <- as.list(rep(as.numeric(vec[1]), len)) 
    names(out) <- as.character(vec[-1]) 
    out 
} 

vektör kullanarak, o verir:

> vec <- c("1", "a","b") 
> makeList(vec) 
$a 
[1] 1 

$b 
[1] 1 
+1

"as.numeric" öğesini "1" –

+0

@ Joshua; woops! İyi noktalanmış. –

10

as.list ve setNames kullanma:

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

__________neat! –

+2

Bu soruyu, bir vektörün adlandırılmış bir listeye dönüştürülmesine ilişkin genel bir çözüm için bir çözüm ararken bulduğumda, sadece içerikler ile aynı isimleri aldırmazsanız bunu da yapabileceğinizi eklemek istedim: 'as.list (setNames (x, x))' – user5359531

2

Tamlık için, bir uygulamada bunu yapmak için daha basit bir tek liner var istendiği gibi ly" stili:

as.list(sapply(x[-1],function(y) as.double(x[1]))) 

, bu soruya bir cevap olarak yerini hak edecek kadar mutlaka temiz en hızlı seçenektir olmasa da. Bir vektöre gereksiz bir şekilde basitleştirilememekle önemli bir hızlandırma mümkündür:

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 
+0

'as.list (sapply (...)) 'yerine' sapply (..., sadeleştirin = FALSE)' komutunu kullanın. –

+0

Basitleştirmeksizin = F, biz istemedim özdeş (Charles, Anon) = FALSE olacaktır. Sadeleştirme = F ile öneriniz daha fazla hızlandırmaya yol açar --- Cevabımı güncelledim. Teşekkürler. – andrekos

İlgili konular