2015-10-07 10 views
14
mylist <- list(NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 
    123, NULL, 456) 

> mylist 
[[1]] 
NULL 

[[2]] 
NULL 

[[3]] 
NULL 

[[4]] 
NULL 

[[5]] 
NULL 

[[6]] 
NULL 

[[7]] 
NULL 

[[8]] 
NULL 

[[9]] 
NULL 

[[10]] 
NULL 

[[11]] 
[1] 123 

[[12]] 
NULL 

[[13]] 
[1] 456 

मेरी सूची में 13 तत्व हैं, जिनमें से 11 न्यूल हैं। मैं उन्हें हटाना चाहता हूं, लेकिन उन तत्वों के सूचकांक को संरक्षित करता हूं जो अपर्याप्त हैं।आर: सूची से NULL तत्वों को हटा रहा है

mylist2 = mylist[-which(sapply(mylist, is.null))] 
> mylist2 
[[1]] 
[1] 123 

[[2]] 
[1] 456 

यह शून्य तत्व ठीक निकालता है, लेकिन मैं अरिक्त तत्वों reindexed जा करने के लिए, यानी नहीं करना चाहते, मैं mylist2 कुछ इस तरह है, जहां अरिक्त प्रविष्टियों का सूचकांक संरक्षित कर रहे हैं देखने के लिए चाहते हैं।

> mylist2 
[[11]] 
[1] 123 

[[13]] 
[1] 456 
+0

किसी को रास्ता मिल सकता है, लेकिन मुझे लगता है कि आप "उस तरह से प्रिंट क्यों कर रहे हैं" जाल में गिर रहे हैं। वे इंडेक्स नंबर आपके सूची तत्वों के नाम नहीं हैं। कोई नाम नहीं हैं 'नाम (मेरी सूची) 'की जांच करें। इसलिए वे केवल सहायक हैं जो दिखाते हैं कि तत्व कहां हैं। यही कारण है कि आपको केवल दो तत्वों के साथ सूची की 11 वीं स्थिति वापस करने के लिए आर को बताने में परेशानी हो रही है। आप नीचे दिए गए उत्तर के रूप में सूची का नामकरण करने का प्रयास कर सकते हैं। –

उत्तर

24

निकटतम आप पहली सूची तत्व नाम के लिए और फिर हटाने NULLs है प्राप्त करने में सक्षम हो जाएगा के साथ है।

names(x) <- seq_along(x) 

## Using some higher-order convenience functions 
Filter(Negate(is.null), x) 
# $`11` 
# [1] 123 
# 
# $`13` 
# [1] 456 

# Or, using a slightly more standard R idiom 
x[sapply(x, is.null)] <- NULL 
x 
# $`11` 
# [1] 123 
# 
# $`13` 
# [1] 456 
4

आप नाम रखना चाहते हैं आप

a <- list(NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 
      123, NULL, 456) 
non_null_names <- which(!sapply(a, is.null)) 
a <- a[non_null_names] 
names(a) <- non_null_names 
a 

फिर आप की तरह तो

a[['11']] 
num <- 11 
a[[as.character(num)]] 
a[[as.character(11)]] 
a$`11` 

आप उन्हें साफ [[11]] में नहीं मिल सकता है तत्वों का उपयोग कर सकते कर सकते हैं, [[13]] नोटेशन, हालांकि, क्योंकि वे संख्यात्मक सूचकांक का प्रतिनिधित्व करते हैं।

+0

यह वास्तव में किया जा सकता है जो आप चाहते हैं कि वास्तव में किया जा सकता है :) –

2

यहाँ यह सुविधाजनक श्रृंखलन अंकन

library(magrittr) 

mylist %>% 
    setNames(seq_along(.)) %>% 
    Filter(. %>% is.null %>% `!`, .) 
+6

'फ़िल्टर (नेगेट (is.null), setNames (एल, seq_along (एल)) 'पढ़ने के लिए बहुत आसान है। – thelatemail

+0

ठीक है, इस मुद्दे को ठीक किया गया। Negate! = '!' – bramtayl

2

एक समारोह है कि स्वचालित रूप से एक सूची के सभी रिक्त प्रविष्टियां निकाल दी है, और यदि सूची में नाम है, यह गैर-शून्य प्रविष्टियों के नाम रखता है।

इस फ़ंक्शन को plyr पैकेज से compact कहा जाता है।

l <- list(NULL, NULL, foo, bar) 
names(l) <- c("one", "two", "three", "four") 

plyr::compact(l) 

आप में गैर-शून्य प्रविष्टियों की अनुक्रमणिका सुरक्षित रखना चाहते हैं, तो आप सूची के रूप में यह पहले पोस्ट में किया जाता है नाम कर सकते हैं और उसके बाद अपनी सूची को संकुचित:

names(l) <- seq_along(l) 
plyr::compact(l) 
संबंधित मुद्दे