दिलचस्प पोस्ट
यादृच्छिक पंक्तियों PostgreSQL चुनने का सर्वोत्तम तरीका एक पीडीएफ बनाने के बिना पीडीएफ़ कैसे अपडेट करें? "#! / Usr / bin / env अजगर" के साथ अजगर को तर्क नहीं दिया जा सकता है कैसे Node.js में फ़ाइलों को स्वत: पुनः लोड करें? कैसे एक सही MySQL कनेक्शन स्ट्रिंग बनाने के लिए? जब std :: चालन फ़ंक्शन रिटर्न मान पर किया जाना चाहिए? विभाजन गलती, बड़ी सरणी स्क्रॉलिंग यूआईएसक्रोलएव्यू के दौरान यूआईएलबल को अपडेट करना बंद हो जाता है एंड्रॉइड गतिविधि जीवन चक्र – इन सभी तरीकों के लिए क्या हैं? एएसपी.NET MVC 4 अनुमति कोड के साथ कस्टम ऑथराइज विशेषता (बिना भूमिकाओं) सीज़न द्विदिश मानचित्रण के कारण जेसन सीरियललाइज़र में परिपत्र संदर्भ कैसे हल करें? वास्तव में एक प्रयास में क्या होता है {वापसी x; } अंत में {x = शून्य; } बयान? जेफ्री चार्ट बारचार्ट -> नो ग्रेडिएंट मुझे कॉन्स्ट सही पर बेचना डिज़ाइन में सीएसएस अनुकूलित स्क्रॉल पट्टी

आर में नेस्टेड इफेल का बयान

मैं यहां नया हूँ और आर पर शुरुआत कर रहा हूं। मैं विंडोज 7 पर नवीनतम आर 3.0.1 का उपयोग करता हूं।

मैं अभी भी एसएएस कोड को आर में अनुवाद करने का सीख रहा हूं और मुझे चेतावनियां मिलती हैं I मुझे समझना होगा कि मैं गलतियां कहाँ बना रहा हूं मैं क्या करना चाहता हूं एक चर पैदा करता है जो जनसंख्या के 3 राज्यों को सारांशित करता है और अलग करता है: मुख्य भूमि, विदेशी, विदेशी मेरे पास 2 वेरिएबल्स वाला डेटाबेस है:

  • आईडी राष्ट्रीयता: idnat (फ्रेंच, विदेशी),

अगर idnat फ्रेंच है तो:

  • आईडी जन्मस्थान: idbp (मुख्य भूमि, कॉलोनी, विदेशी)

मैं idnat और idbp से एक नया चर idnat2 नामक जानकारी में संक्षेप करना चाहता idnat2 :

  • स्थिति: कश्मीर (मुख्य भूमि, विदेशी, विदेशी)

सभी शोधकर्ता चर "वर्ण प्रकार" का उपयोग करते हैं

स्तंभ idnat2 में अपेक्षित परिणाम:

  idnat idbp idnat2 1 french mainland mainland 2 french colony overseas 3 french overseas overseas 4 foreign foreign foreign 

यहां मेरा एसएएस कोड है, मैं आर में अनुवाद करना चाहता हूं:

 if idnat = "french" then do; if idbp in ("overseas","colony") then idnat2 = "overseas"; else idnat2 = "mainland"; end; else idnat2 = "foreigner"; run; 

यहां आर में मेरा प्रयास है:

 if(idnat=="french"){ idnat2 <- "mainland" } else if(idbp=="overseas"|idbp=="colony"){ idnat2 <- "overseas" } else { idnat2 <- "foreigner" } 

मुझे यह चेतावनी मिली:

 Warning message: In if (idnat=="french") { : the condition has length > 1 and only the first element will be used 

मुझे इसकी सुगमता के बजाय "नेस्टेड ifelse " का उपयोग करने की सलाह दी गई, लेकिन अधिक चेतावनियां प्राप्त की ifelse :

 idnat2 <- ifelse (idnat=="french", "mainland", ifelse (idbp=="overseas"|idbp=="colony", "overseas") ) else (idnat2 <- "foreigner") 

चेतावनी संदेश के मुताबिक लम्बाई 1 से अधिक है इसलिए केवल पहले कोष्ठक के बीच क्या होता है। माफ करना, लेकिन मुझे नहीं पता कि ये लम्बाई यहाँ क्या है? किसी को पता है कि मैं कहाँ गलत हूं?

वेब के समाधान से एकत्रित समाधान "आर में नेस्टेड इफेल का बयान"

यदि आप किसी भी स्प्रेडशीट एप्लिकेशन का उपयोग कर रहे हैं, तो एक मूल फ़ंक्शन if() वाक्यविन्यास के साथ:

 if(<condition>, <yes>, <no>) 

सिंटेक्स वास्तव में ifelse() लिए समान है:

 ifelse(<condition>, <yes>, <no>) 

स्प्रेडशीट अनुप्रयोग में if() में अंतर यह है कि आर ifelse() vectorized है (इनपुट पर इनपुट और वापसी वेक्टर के रूप में लेता है) स्प्रैडशीट एप्लिकेशन में सूत्रों की तुलना में और उदाहरण के लिए आर पर विचार करें जहां हम तुलना करना चाहते हैं यदि ए> बी और रिटर्न 1 यदि हाँ और 0 यदि नहीं है तो

स्प्रैडशीट में:

  ABC 1 3 1 =if(A1 > B1, 1, 0) 2 2 2 =if(A2 > B2, 1, 0) 3 1 3 =if(A3 > B3, 1, 0) 

आर में:

 > a <- 3:1; b <- 1:3 > ifelse(a > b, 1, 0) [1] 1 0 0 

ifelse() कई मायनों में नेस्टेड किया जा सकता है:

 ifelse(<condition>, <yes>, ifelse(<condition>, <yes>, <no>)) ifelse(<condition>, ifelse(<condition>, <yes>, <no>), <no>) ifelse(<condition>, ifelse(<condition>, <yes>, <no>), ifelse(<condition>, <yes>, <no>) ) ifelse(<condition>, <yes>, ifelse(<condition>, <yes>, ifelse(<condition>, <yes>, <no>) ) ) 

स्तंभ idnat2 गणना करने के लिए आप यह कर सकते हैं:

 df <- read.table(header=TRUE, text=" idnat idbp idnat2 french mainland mainland french colony overseas french overseas overseas foreign foreign foreign" ) with(df, ifelse(idnat=="french", ifelse(idbp %in% c("overseas","colony"),"overseas","mainland"),"foreign") ) 

दस्तावेज़ीकरण

क्या the condition has length > 1 and only the first element will be used ? चलो देखते हैं:

 > # What is first condition really testing? > with(df, idnat=="french") [1] TRUE TRUE TRUE FALSE > # This is result of vectorized function - equality of all elements in idnat and > # string "french" is tested. > # Vector of logical values is returned (has the same length as idnat) > df$idnat2 <- with(df, + if(idnat=="french"){ + idnat2 <- "xxx" + } + ) Warning message: In if (idnat == "french") { : the condition has length > 1 and only the first element will be used > # Note that the first element of comparison is TRUE and that's whay we get: > df idnat idbp idnat2 1 french mainland xxx 2 french colony xxx 3 french overseas xxx 4 foreign foreign xxx > # There is really logic in it, you have to get used to it 

क्या मैं अभी भी उपयोग कर सकता हूँ if() ? हां, आप कर सकते हैं, लेकिन सिंटैक्स इतना अच्छा नहीं है 🙂

 test <- function(x) { if(x=="french") { "french" } else{ "not really french" } } apply(array(df[["idnat"]]),MARGIN=1, FUN=test) 

यदि आप SQL से परिचित हैं, तो आप sqldf पैकेज में CASE कथन का उपयोग भी कर सकते हैं।

निम्न की तरह कुछ प्रयास करें:

 # some sample data idnat <- sample(c("french","foreigner"),100,TRUE) idbp <- rep(NA,100) idbp[idnat=="french"] <- sample(c("mainland","overseas","colony"),sum(idnat=="french"),TRUE) # recoding out <- ifelse(idnat=="french" & !idbp %in% c("overseas","colony"), "mainland", ifelse(idbp %in% c("overseas","colony"),"overseas", "foreigner")) cbind(idnat,idbp,out) # check result 

तुम्हारा भ्रम यह है कि एसएएस और आर संभाल कैसे -अन्य निर्माण करते हैं। आर में, if और else वेक्टरयुक्त नहीं हैं, जिसका अर्थ है कि वे एक ही स्थिति सच है या नहीं (यानी, if("french"=="french") काम करता है) और कई तार्किक (यानी, if(c("french","foreigner")=="french") काम नहीं करता है) और आर आपको उस चेतावनी को प्राप्त करता है जिसे आप प्राप्त कर रहे हैं।

इसके विपरीत, ifelse vectorized है, तो यह आपके vectors (aka इनपुट चर) ले जा सकते हैं और अपने प्रत्येक तत्वों पर तार्किक स्थिति का परीक्षण कर सकते हैं, जैसे आप एसएएस में इस्तेमाल होते हैं। इसके चारों ओर अपने सिर को लपेटने का एक वैकल्पिक तरीका if और else बयानों का उपयोग करके एक लूप का निर्माण करना होगा (जैसा कि आप यहां करना शुरू कर चुके हैं) लेकिन ifelse दृष्टिकोण अधिक कुशल होगा और आमतौर पर कम कोड शामिल होगा

आप if और ifelse बिना सदिश idnat2 बना सकते हैं

फ़ंक्शन की replace "overseas" साथ "overseas" "colony" की सभी घटनाओं को बदलने के लिए उपयोग किया जा सकता है:

 idnat2 <- replace(idbp, idbp == "colony", "overseas") 

यदि डेटा सेट में कई पंक्तियाँ हैं तो यह नेस्टेड ifelse() बजाय data.table का उपयोग करके एक लुकअप तालिका के साथ जुड़ने के लिए अधिक कुशल हो सकता है।

नीचे लुकअप तालिका प्रदान की गई

 lookup 
  idnat idbp idnat2 1: french mainland mainland 2: french colony overseas 3: french overseas overseas 4: foreign foreign foreign 

और एक नमूना डेटा सेट

 library(data.table) n_row <- 10L set.seed(1L) DT <- data.table(idnat = "french", idbp = sample(c("mainland", "colony", "overseas", "foreign"), n_row, replace = TRUE)) DT[idbp == "foreign", idnat := "foreign"][] 
  idnat idbp 1: french colony 2: french colony 3: french overseas 4: foreign foreign 5: french mainland 6: foreign foreign 7: foreign foreign 8: french overseas 9: french overseas 10: french mainland 

तो हम शामिल होने के दौरान एक अपडेट कर सकते हैं:

 DT[lookup, on = .(idnat, idbp), idnat2 := i.idnat2][] 
  idnat idbp idnat2 1: french colony overseas 2: french colony overseas 3: french overseas overseas 4: foreign foreign foreign 5: french mainland mainland 6: foreign foreign foreign 7: foreign foreign foreign 8: french overseas overseas 9: french overseas overseas 10: french mainland mainland 

SQL मामले का उपयोग dplyr और sqldf संकुल के साथ बयान:

डेटा

 df <-structure(list(idnat = structure(c(2L, 2L, 2L, 1L), .Label = c("foreign", "french"), class = "factor"), idbp = structure(c(3L, 1L, 4L, 2L), .Label = c("colony", "foreign", "mainland", "overseas"), class = "factor")), .Names = c("idnat", "idbp"), class = "data.frame", row.names = c(NA, -4L)) 

sqldf

 library(sqldf) sqldf("SELECT idnat, idbp, CASE WHEN idbp IN ('colony', 'overseas') THEN 'overseas' ELSE idbp END AS idnat2 FROM df") 

dplyr

 library(dplyr) df %>% mutate(idnat2 = case_when(.$idbp == 'mainland' ~ "mainland", .$idbp %in% c("colony", "overseas") ~ "overseas", TRUE ~ "foreign")) 

उत्पादन

  idnat idbp idnat2 1 french mainland mainland 2 french colony overseas 3 french overseas overseas 4 foreign foreign foreign 

डेटा के साथ योग्य, समाधान है:

 DT[, idnat2 := ifelse(idbp %in% "foreign", "foreign", ifelse(idbp %in% c("colony", "overseas"), "overseas", "mainland" ))] 

ifelse है if-else नहीं हैं यहां, डीटी है:

  idnat idbp 1 french mainland 2 french colony 3 french overseas 4 foreign foreign 

यह देता है:

  idnat idbp idnat2 1: french mainland mainland 2: french colony overseas 3: french overseas overseas 4: foreign foreign foreign