आर

2012-04-02 9 views
6

में एक सूची प्रविष्टि की अनुक्रमणिका के लिए खोजें आर सूची को देखते हुए, मैं किसी दिए गए सूची प्रविष्टि का सूचकांक ढूंढना चाहता हूं। उदाहरण के लिए, "36" प्रविष्टि के लिए, मैं चाहता हूं कि मेरा आउटपुट "2" हो। साथ ही, मैं लापरवाही से समानांतर में ऐसे प्रश्न कैसे कर सकता हूं?आर

सूची

$ 1 [1] "7" "12" "26" "29"

$ 2 [1] "11" "36"

$ 3 [1] "20" "49"

$ 4 [1] "39" "41"

+0

शायद कुछ लापरवाही (घटक_सूची, फ़ंक्शन (x) कोई भी (मिलान (x, "36"))) 'आपको बंद कर देता है। –

+1

आपका उदाहरण संदिग्ध है क्योंकि "36" दूसरी सूची तत्व और दूसरी सूची तत्व में दूसरा तत्व है। –

उत्तर

8

यहाँ एक एक लाइनर कि (?) की संभावना संभावना है कि सूची के एक से अधिक तत्व स्ट्रिंग जिसके लिए आप खोज कर रहे हैं में शामिल होंगे के लिए अनुमति देता है:

## Some example data 
ll <- list(1:4, 5:6, 7:12, 1:12) 
ll <- lapply(ll, as.character) 

which(sapply(ll, FUN=function(X) "12" %in% X)) 
# [1] 3 4 
+1

बहुत बहुत धन्यवाद! आर शुरुआत में सिरदर्द का थोड़ा सा हो सकता है। – SAT

+0

@ जोश: क्या आपका उदाहरण वापस नहीं होना चाहिए '[1] 3 4'? –

+0

@CarlWitthoft - हाँ, धन्यवाद। (मैंने जल्दी से एक त्वरित कोड संपादित किया था लेकिन परिणाम बिट को बदलने के लिए स्पष्ट रूप से उपेक्षित किया गया था।) अब इसे ठीक करें। साथ ही, अपने आप की तरह चीजों को संपादित करने के लिए स्वतंत्र महसूस करें (कम से कम मेरी किसी भी पोस्ट में)! –

2

आपको सबसे पहले एक data.frame कि सूची में उनके समतुल्य सूचकांक के मूल्यों के नक्शे में अपनी सूची बदल सकती है:

ll <- list(c("7", "12", "26", "29"), 
      c("11", "36"), 
      c("20", "49"), 
      c("39", "41")) 

df <- data.frame(value = unlist(ll), 
       index = rep(seq_along(ll), lapply(ll, length))) 
df 
# value index 
# 1  7  1 
# 2  12  1 
# 3  26  1 
# 4  29  1 
# 5  11  2 
# 6  36  2 
# 7  20  3 
# 8  49  3 
# 9  39  4 
# 10 41  4 

फिर, पहले घटित के सूचकांक को खोजने के लिए एक समारोह का उपयोग कर match बारे में किसी दिए गए मूल्य का Rence:

find.idx <- function(val)df$index[match(val, df$value)] 

आप इस समारोह के लिए एक एकल मूल्य पर कई एक समय में match के बाद से कॉल कर सकते हैं, या vectorized है:

find.idx("36") 
# [1] 2 
find.idx(c("36", "41", "99")) 
# [1] 2 4 NA 
बेशक

, आप भी lapply के माध्यम से चला सकते हैं समानांतर रूप से इसे चलाने के लिए विशेष रूप से यदि आप की योजना:

lapply(c("36", "41", "99"), find.idx) 
# [[1]] 
# [1] 2 
# 
# [[2]] 
# [1] 4 
# 
# [[3]] 
# [1] NA 

समानांतर में यह पिछले सा चल रहा है के लिए, वहाँ कई, कई विकल्प हैं। मैं आपको http://cran.r-project.org/web/views/HighPerformanceComputing.html के माध्यम से खोज करके अपने विकल्पों का वजन करने की सलाह दूंगा।