दिलचस्प पोस्ट
कॉलिंग सेटेट को तुरंत राज्य बदलना नहीं है स्विफ्ट कोड को ऑब्जेक्टिव-सी में कैसे आयात करें "ब्रेकपॉइंट वर्तमान में हिट नहीं हो पाएगा स्रोत कोड मूल संस्करण से अलग है। "इसका क्या अर्थ है? कौन सा $ _SERVER चर सुरक्षित हैं? HTML / Javascript परिवर्तन div सामग्री MySQL को कैसे – skip-grant-tables के साथ आरंभ करें? didReiveiveRemoteNotification नहीं कहा जाता है, आईओएस 10 कैसे चेक किया जाए कि दिए गए सी ++ स्ट्रिंग या चार * केवल अंक हैं? Google नक्शे v3 में बहुभुज का केंद्र कैसे प्राप्त करें? jQuery के AJAX सफलता कॉलबैक फ़ंक्शन परिभाषा सभी जगहों पर अनचाहे प्रकार एरर में प्राइमफेस के लिए jQuery को जोड़ना मैं ColorStateList प्रोग्राम को कैसे बनाऊं? Django डेटाबेस क्वेरी: दिनांक सीमा से वस्तुओं को कैसे फ़िल्टर करें? Android पर 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 का उपयोग करने की कोशिश की, लेकिन शायद इस समस्या को संभालने के लिए अन्य, बेहतर तरीके हैं?

वेब के समाधान से एकत्रित समाधान "सशर्त परिवर्तन के लिए 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