दिलचस्प पोस्ट
बतख टंकण क्या है? मुझे एक टंकिनर आवेदन में मुख्य लूप को कैसे कॉल करना पड़ता है? क्या मैं फ़ील्ड 'datetime' या 'टाइमस्टैम्प' का उपयोग करूँ? फाइबोनैचि श्रृंखला 2 ^ एन और नहीं ^ 2 की गणना की जटिलता क्यों है? एंड्रॉयड खोज ViewbyId एक संस्करण स्ट्रिंग के साथ बच्चे के झुंड से सब-प्रोसेस में कंसोल में पायथन आउटपुट Java EE वेब अनुप्रयोग के माध्यम से एक सर्वर (वेब ​​कंटेनर) पर एक फाइल कैसे संचित करें? डबल। समानता के लिए एप्सिलॉन, से बड़ा, कम से कम, या उसके बराबर या उससे अधिक के बराबर क्या जवाक को "अनचेक या असुरक्षित संचालन का उपयोग" चेतावनी जारी करने का कारण बनता है मैं रनटाइम पर कैसे पता लगा सकता हूं कि .NET संस्करण 4.5 वर्तमान में आपका कोड चला रहा है? एकाधिक फ़ील्ड्स द्वारा ऑब्जेक्ट्स की तुलना कैसे करें आईओएस पर टेक्स्ट रैपिंग के साथ मैं कैसे छवि खींच सकता हूँ? AngularJS $ http और $ संसाधन सरल कस्टम लॉगिंग चौखटे के साथ सूत्रों के माध्यम से जावा एफएक्स टेक्स्टएरिया के लिए संदेश लॉग करने का सबसे कारगर तरीका उखाड़ने का इतिहास निकालें

सशर्त परिवर्तन के लिए dplyr पैकेज का उपयोग किया जा सकता है?

उत्परिवर्तन सशर्त होने पर उत्परिवर्तित किया जा सकता है (कुछ कॉलम मूल्यों के मूल्यों के आधार पर)?

यह उदाहरण यह दिखाने में मदद करता है कि मेरा क्या मतलब है

structure(list(a = c(1, 3, 4, 6, 3, 2, 5, 1), b = c(1, 3, 4, 2, 6, 7, 2, 6), c = c(6, 3, 6, 5, 3, 6, 5, 3), d = c(6, 2, 4, 5, 3, 7, 2, 6), e = c(1, 2, 4, 5, 6, 7, 6, 3), f = c(2, 3, 4, 2, 2, 7, 5, 2)), .Names = c("a", "b", "c", "d", "e", "f"), row.names = c(NA, 8L), class = "data.frame") abcdef 1 1 1 6 6 1 2 2 3 3 3 2 2 3 3 4 4 6 4 4 4 4 6 2 5 5 5 2 5 3 6 3 3 6 2 6 2 7 6 7 7 7 7 5 2 5 2 6 5 8 1 6 3 6 3 2 

मैं एक नई कॉलम बनाने के लिए dplyr पैकेज (और हाँ मुझे यह पता नहीं है कि काम करना चाहिए, लेकिन मुझे लगता है कि यह उद्देश्य स्पष्ट बनाता है) का उपयोग कर मेरी समस्या का समाधान खोजने की उम्मीद कर रहा था:

  library(dplyr) df <- mutate(df, if (a == 2 | a == 5 | a == 7 | (a == 1 & b == 4)){g = 2}, if (a == 0 | a == 1 | a == 4 | a == 3 | c == 4){g = 3}) 

जिस कोड का मैं तलाश कर रहा हूं उसका परिणाम इस विशेष उदाहरण में होना चाहिए:

  abcdefg 1 1 1 6 6 1 2 3 2 3 3 3 2 2 3 3 3 4 4 6 4 4 4 3 4 6 2 5 5 5 2 NA 5 3 6 3 3 6 2 NA 6 2 7 6 7 7 7 2 7 5 2 5 2 6 5 2 8 1 6 3 6 3 2 3 

क्या किसी को भी यह कैसे dplyr में ऐसा करने के बारे में एक विचार है? यह डेटा फ्रेम सिर्फ एक उदाहरण है, मैं जिस डेटा फ़्रेम का उपयोग कर रहा हूं वह बहुत बड़ा है इसकी गति के कारण मैंने dplyr का उपयोग करने की कोशिश की, लेकिन शायद इस समस्या को संभालने के लिए अन्य, बेहतर तरीके हैं?

Solutions Collecting From Web of "सशर्त परिवर्तन के लिए dplyr पैकेज का उपयोग किया जा सकता है?"

ifelse उपयोग करें

 df %>% mutate(g = ifelse(a == 2 | a == 5 | a == 7 | (a == 1 & b == 4), 2, ifelse(a == 0 | a == 1 | a == 4 | a == 3 | c == 4, 3, NA))) 

जोड़ा गया: ध्यान दें कि dplyr 0.5 में एक if_else परिभाषित समारोह है, तो एक वैकल्पिक ifelse साथ if_else को बदलने के लिए होगा; हालांकि, ध्यान दें कि if_else की तुलना में सख्त है (स्थिति के दोनों पैरों में एक ही प्रकार का होना चाहिए) तो इस मामले में NA को NA_real_ साथ NA_real_

 df %>% mutate(g = if_else(a == 2 | a == 5 | a == 7 | (a == 1 & b == 4), 2, if_else(a == 0 | a == 1 | a == 4 | a == 3 | c == 4, 3, NA_real_))) 

जोड़ा गया चूंकि यह सवाल पोस्ट किया गया था case_when एक और विकल्प होगा जोड़ा गया है:

 df %>% mutate(g = case_when(a == 2 | a == 5 | a == 7 | (a == 1 & b == 4) ~ 2, a == 0 | a == 1 | a == 4 | a == 3 | c == 4 ~ 3, TRUE ~ NA_real_)) 

चूंकि आप समस्या को संभालने के अन्य बेहतर तरीकों के लिए पूछते हैं, data.table का उपयोग करने वाला एक और तरीका है:

 require(data.table) ## 1.9.2+ setDT(df) df[a %in% c(0,1,3,4) | c == 4, g := 3L] df[a %in% c(2,5,7) | (a==1 & b==4), g := 2L] 

नोट करें कि कंडिशनल स्टेटमेंट्स के आदेश को सही ढंग से प्राप्त करने के लिए उलट दिया गया है। द्वितीय असाइनमेंट के दौरान भी g की कोई प्रतिलिपि नहीं बनाई गई है – इसे जगह में जगह दी गई है

बड़े आंकड़ों पर नेस्टेड if-else तुलना में बेहतर प्रदर्शन किया है, क्योंकि यह 'हाँ' और 'नहीं' दोनों मामलों का मूल्यांकन कर सकता है , और नेस्टिंग को आईएमएचओ पढ़ने / बनाए रखने के लिए कठिन हो सकता है।


यहां अपेक्षाकृत बड़ा डेटा पर एक बेंचमार्क है:

 # R version 3.1.0 require(data.table) ## 1.9.2 require(dplyr) DT <- setDT(lapply(1:6, function(x) sample(7, 1e7, TRUE))) setnames(DT, letters[1:6]) # > dim(DT) # [1] 10000000 6 DF <- as.data.frame(DT) DT_fun <- function(DT) { DT[(a %in% c(0,1,3,4) | c == 4), g := 3L] DT[a %in% c(2,5,7) | (a==1 & b==4), g := 2L] } DPLYR_fun <- function(DF) { mutate(DF, g = ifelse(a %in% c(2,5,7) | (a==1 & b==4), 2L, ifelse(a %in% c(0,1,3,4) | c==4, 3L, NA_integer_))) } BASE_fun <- function(DF) { # R v3.1.0 transform(DF, g = ifelse(a %in% c(2,5,7) | (a==1 & b==4), 2L, ifelse(a %in% c(0,1,3,4) | c==4, 3L, NA_integer_))) } system.time(ans1 <- DT_fun(DT)) # user system elapsed # 2.659 0.420 3.107 system.time(ans2 <- DPLYR_fun(DF)) # user system elapsed # 11.822 1.075 12.976 system.time(ans3 <- BASE_fun(DF)) # user system elapsed # 11.676 1.530 13.319 identical(as.data.frame(ans1), as.data.frame(ans2)) # [1] TRUE identical(as.data.frame(ans1), as.data.frame(ans3)) # [1] TRUE 

सुनिश्चित नहीं है कि यह आपके लिए एक वैकल्पिक विकल्प है, लेकिन मुझे आशा है कि यह मदद करता है।

dplyr अब एक समारोह के case_when है, case_when कि एक case_when प्रदान करता है वाक्यविन्यास mosaic:::derivedFactor की तुलना में थोड़ा अजीब है क्योंकि आप मानक dplyr रास्ते में चर का उपयोग नहीं कर सकते, और एनए के मोड को घोषित करने की आवश्यकता है, लेकिन यह mosaic:::derivedFactor तुलना में काफी तेज है।

 df %>% mutate(g = case_when(a %in% c(2,5,7) | (a==1 & b==4) ~ 2L, a %in% c(0,1,3,4) | c == 4 ~ 3L, TRUE~as.integer(NA))) 

संपादित करें: यदि आप पैकेज के संस्करण 0.7.0 से पहले dplyr::case_when() का प्रयोग कर रहे हैं, तो आपको ' .$ ' के साथ वेरिएबल नामों से पहले की आवश्यकता है (उदाहरण के लिए लिखें .$a == 1 )

बेंचमार्क : बेंचमार्क (अरुण के पोस्ट से पुन: उपयोग करने के कार्य) और नमूना आकार को कम करने के लिए:

 require(data.table) require(mosaic) require(dplyr) require(microbenchmark) DT <- setDT(lapply(1:6, function(x) sample(7, 10000, TRUE))) setnames(DT, letters[1:6]) DF <- as.data.frame(DT) DPLYR_case_when <- function(DF) { DF %>% mutate(g = case_when(a %in% c(2,5,7) | (a==1 & b==4) ~ 2L, a %in% c(0,1,3,4) | c==4 ~ 3L, TRUE~as.integer(NA))) } DT_fun <- function(DT) { DT[(a %in% c(0,1,3,4) | c == 4), g := 3L] DT[a %in% c(2,5,7) | (a==1 & b==4), g := 2L] } DPLYR_fun <- function(DF) { mutate(DF, g = ifelse(a %in% c(2,5,7) | (a==1 & b==4), 2L, ifelse(a %in% c(0,1,3,4) | c==4, 3L, NA_integer_))) } mosa_fun <- function(DF) { mutate(DF, g = derivedFactor( "2" = (a == 2 | a == 5 | a == 7 | (a == 1 & b == 4)), "3" = (a == 0 | a == 1 | a == 4 | a == 3 | c == 4), .method = "first", .default = NA )) } microbenchmark( DT_fun(DT), DPLYR_fun(DF), DPLYR_case_when(DF), mosa_fun(DF), times=20 ) 

यह देता है:

  expr min lq mean median uq max neval DT_fun(DT) 1.503589 1.626971 2.054825 1.755860 2.292157 3.426192 20 DPLYR_fun(DF) 2.420798 2.596476 3.617092 3.484567 4.184260 6.235367 20 DPLYR_case_when(DF) 2.153481 2.252134 6.124249 2.365763 3.119575 72.344114 20 mosa_fun(DF) 396.344113 407.649356 413.743179 412.412634 416.515742 459.974969 20 

mosaic पैकेज से derivedFactor समारोह इस को संभालने के लिए डिजाइन किया जा रहा है। इस उदाहरण का उपयोग करना, यह ऐसा दिखेगा:

 library(dplyr) library(mosaic) df <- mutate(df, g = derivedFactor( "2" = (a == 2 | a == 5 | a == 7 | (a == 1 & b == 4)), "3" = (a == 0 | a == 1 | a == 4 | a == 3 | c == 4), .method = "first", .default = NA )) 

(यदि आप परिणाम को एक कारक के बजाय संख्यात्मक derivedFactor चाहते हैं, तो आप एक as.numeric कॉल में derivedFactor लपेट कर सकते हैं।)

derivedFactor शर्तों के एक मनमाना संख्या के लिए भी इस्तेमाल किया जा सकता है, भी।

case_when अब जब एसक्यूएल-शैली के मामले का एक बहुत साफ कार्यान्वयन है जब:

 structure(list(a = c(1, 3, 4, 6, 3, 2, 5, 1), b = c(1, 3, 4, 2, 6, 7, 2, 6), c = c(6, 3, 6, 5, 3, 6, 5, 3), d = c(6, 2, 4, 5, 3, 7, 2, 6), e = c(1, 2, 4, 5, 6, 7, 6, 3), f = c(2, 3, 4, 2, 2, 7, 5, 2)), .Names = c("a", "b", "c", "d", "e", "f"), row.names = c(NA, 8L), class = "data.frame") -> df df %>% mutate( g = case_when( a == 2 | a == 5 | a == 7 | (a == 1 & b == 4 ) ~ 2, a == 0 | a == 1 | a == 4 | a == 3 | c == 4 ~ 3 )) 

Dplyr का उपयोग 0.7.4

मैनुअल: http://dplyr.tidyverse.org/reference/case_when.html