2011-06-27 19 views
5

मैं आर का उपयोग कर रहा हूं और उत्तर के लिए चारों ओर खोज किया है, लेकिन जब मैंने इसी तरह के प्रश्न देखे हैं, तो यह मेरी विशिष्ट समस्या के लिए काम नहीं किया है।एनए की सैपली फ़ंक्शन में अनदेखा करें

मेरे डेटा सेट में मैं NA के प्लेसहोल्डर्स के रूप में उपयोग करने की कोशिश कर रहा हूं क्योंकि मैं अपने विश्लेषण का हिस्सा लेने के बाद उन पर वापस लौटने जा रहा हूं इसलिए, मैं अपनी सभी गणनाओं को करने में सक्षम होना चाहता हूं अगर NA वास्तव में वहां नहीं थे।

Error in if ((x) > test) { : missing value where TRUE/FALSE needed 

तुम लोग जानते हैं, यह कुछ sapply समारोह के साथ गलत है:

यहाँ एक उदाहरण डेटा तालिका

ROCA = c(1,3,6,2,1,NA,2,NA,1,NA,4,NA) 
ROCA <- data.frame (ROCA=ROCA)  # converting it just because that is the format of my original data 

#Now my function 
exceedes <- function (L=NULL, R=NULL, na.rm = T) 
{ 
    if (is.null(L) | is.null(R)) { 
     print ("mycols: invalid L,R.") 
     return (NULL)    
    } 
    test <-(mean(L, na.rm=TRUE)-R*sd(L,na.rm=TRUE)) 
    test1 <- sapply(L,function(x) if((x)> test){1} else {0}) 
    return (test1) 
} 
L=ROCA[,1] 
R=.5 
ROCA$newcolumn <- exceedes(L,R) 
names(ROCA)[names(ROCA)=="newcolumn"]="Exceedes1" 

मैं त्रुटि हो रही है साथ मेरे मुद्दा है। NA के अनदेखा करने के तरीके पर कोई विचार? मैं na.omit का प्रयास करूंगा यदि मैं इसे सभी NA के दाएं को सम्मिलित करने के लिए प्राप्त कर सकता हूं, लेकिन मुझे यकीन नहीं है कि यह कैसे करें।

+0

क्यों न केवल एक और कथन समारोह में बयान दर्ज करें जो एनए वापस करता है यदि एक्स एनए है? साथ ही, यदि आप अपने फ़ंक्शन में कहीं भी 'ब्राउज़र()' डालते हैं, तो अगली बार जब आप इसे चलाते हैं तो वह उस स्थान पर रुक जाएगा। –

+0

प्रतिक्रिया के लिए धन्यवाद! मुझे यकीन नहीं है कि मैंने यह सही किया है, क्योंकि मुझे अभी भी एक ही त्रुटि मिल रही है। यहां मेरा कोड test1 <- sapply (एल, फ़ंक्शन (x) है ((x) == NA) {NA} अन्य यदि ((x)> परीक्षण) {1} अन्य {0} ) और त्रुटि है अब: अगर त्रुटि ((x) == NA) {: अनुपलब्ध मान जहां TRUE/FALSE की आवश्यकता है – Tim

+0

आपको इसे जांचने के लिए 'is.na (x)' का उपयोग करना होगा। 'x == NA' वापस लौटाता है ... – Tommy

उत्तर

3

यह बयान अजीब है:

test1 <- sapply(L,function(x) if((x)> test){1} else {0}) 

प्रयास करें: परिणाम में रों:

test1 <- ifelse(is.na(L), NA, ifelse(L > test, 1, 0)) 
+0

आप दोनों को धन्यवाद नहीं दे सकता। वास्तव में त्वरित प्रतिक्रिया की सराहना करते हैं! – Tim

+0

मुझे यकीन नहीं है कि यह एक अलग, लेकिन संबंधित सवाल फिर से पूछना उचित है या नहीं। हर किसी की मदद के लिए धन्यवाद, मैं एक छोटा सा झटका बनाना चाहता था। मेरे डेटा के कुछ हिस्सों में रिक्त स्थान हैं, मैं यह निर्दिष्ट करना चाहता हूं कि कॉलम 5 से 10 के मुकाबले प्रत्येक कॉलम में रिक्त स्थान होंगे, तो मूल्य NA होगा। जिस कोड का मैंने उपयोग करने का प्रयास किया है वह यह है। मुझे निश्चित रूप से मेरे बयान की समीक्षा करने की ज़रूरत है। एक <- अगर (ए [, 10] और एक [11] == "" is.na (a [, 5: 10]) मुझे त्रुटि मिलती है: "ए <- अगर (ए [, 10] और ए में अप्रत्याशित प्रतीक [, 11] == "" is.na " – Tim

+0

'if' एक नियंत्रण संरचना है। आप शायद 'ifelse' चाहते हैं जो एक वेक्टर लौटाता है। –

2

आप एनए करना चाहते हैं? यही है, क्या आप पंक्तियों को लाइन करना चाहते हैं?

ऐसा लगता है कि L > test वापस लौटने की तरह काम करेगा। और कॉलम जोड़ना भी सरलीकृत किया जा सकता है (मुझे संदेह है कि "Exeedes1" कहीं एक चर में है)।

exceedes <- function (L=NULL, R=NULL, na.rm = T) 
{ 
    if (is.null(L) | is.null(R)) { 
     print ("mycols: invalid L,R.") 
     return (NULL)    
    } 
    test <-(mean(L, na.rm=TRUE)-R*sd(L,na.rm=TRUE)) 

    L > test 
} 
L=ROCA[,1] 
R=.5 
ROCA[["Exceedes1"]] <- exceedes(L,R) 
5

वहाँ sapply की कोई जरूरत नहीं है और अपने गुमनाम समारोह क्योंकि > पहले से ही vectorized है।

यह डिफ़ॉल्ट तर्क मान निर्दिष्ट करने के लिए वास्तव में अजीब लगता है जो अमान्य हैं। मेरा अनुमान है कि आप missing फ़ंक्शन का उपयोग करने के बजाय इसे क्लज के रूप में उपयोग कर रहे हैं। NULL वापस करने के बजाय त्रुटि को फेंकना भी अच्छा अभ्यास है क्योंकि फ़ंक्शन NULL पर वापस आने पर आपको पकड़ने की कोशिश करनी होगी।

exceedes <- function (L, R, na.rm=TRUE) 
{ 
    if(missing(L) || missing(R)) { 
    stop("L and R must be provided") 
    } 
    test <- mean(L,na.rm=TRUE)-R*sd(L,na.rm=TRUE) 
    as.numeric(L > test) 
} 

ROCA <- data.frame(ROCA=c(1,3,6,2,1,NA,2,NA,1,NA,4,NA)) 
ROCA$Exceeds1 <- exceedes(ROCA[,1],0.5) 
+0

शून्य का उपयोग करने का लाभ यह है कि स्पष्ट रूप से पास करना हमेशा आसान होता है। कुछ स्थितियों में "गायब" तर्क उत्पन्न करना एक दर्द है। – hadley

+0

@ हैडली: मैं सहमत हूं (इस तरह 'plot.default' कई तर्कों को संभालता है) लेकिन मैं इस विशिष्ट परिस्थिति का जिक्र कर रहा था जहां 'NULL' तर्क मान अमान्य हैं। –

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