2010-12-08 21 views
7

मैं इसएक सूची

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

और मैं इस सूची

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

वहाँ एक "लागू" में यह करने के लिए एक रास्ता है बनाना चाहते हैं जो की तरह एक वेक्टर के लिए एक वेक्टर परिवर्तित अंदाज? धन्यवाद।

-k

+0

हाय खान - एक मूल्य, दो लेबल? यह अजीब लग रहा है। –

+0

मुझे हैश टेबल की तरह एक त्वरित रूप से देखने की ज़रूरत है। इस मामले में, "ए", और "बी" नेटवर्क में नोड्स हैं, और 1 उनकी समुदाय आईडी है। क्या यह कुशल है? – knguyen

उत्तर

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> 
एक पहले त्रुटि खोलना के लिए गेविन के लिए प्रशंसा के साथ

+0

@ डर्क: 'kn' के पास कोई नाम नहीं है, और' लापता 'कदम' एनएलएल 'ओवरराइट नहीं करेगा, इसलिए इससे पहले नाम सेट करना इससे चिपक जाएगा? –

+0

मैंने सचमुच कॉपी किया जो मेरे खोल में काम करता था। –

+0

एर, नहीं, आप काफी सही थे। फिक्स्ड, पुनः रन और संपादित। उसको ढूंढने के लिए धन्यवाद। –

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

"as.numeric'" 1 " –

+0

@ जोशुआ चाहते हैं; ओह! अच्छी तरह से देखा गया। –

10

as.list और setNames का उपयोग करना:

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

__________neat! –

+2

चूंकि मुझे एक प्रश्न सूची में वेक्टर को परिवर्तित करने के अधिक सामान्य मामले के समाधान की तलाश करते हुए यह प्रश्न मिला, तो बस यह जोड़ना चाहता था कि यदि आप सामग्री के समान नामों को ध्यान में रखते हैं तो आप यह भी कर सकते हैं: 'as.list (setNames (x, x))' – user5359531

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

'as.list (sapply (...)) की बजाय,' sapply (..., सरलीकृत = गलत) का उपयोग करें। –

+0

सरलीकृत = एफ के बिना, हमारे पास समान (चार्ल्स, एनोन) = गलत होगा, जो मैं नहीं चाहता था। सरलीकृत = एफ के साथ, आपका सुझाव आगे बढ़ने की ओर जाता है --- मैंने अपना जवाब अपडेट कर लिया है। धन्यवाद। – andrekos

संबंधित मुद्दे