2017-02-05 6 views
14

के लिए सही वाक्यविन्यास NA मान mutate_ifdplyr में शून्य के साथ NA मानों को प्रतिस्थापित करना चाहता है।mutate_if

set.seed(1) 
mtcars[sample(1:dim(mtcars)[1], 5), 
     sample(1:dim(mtcars)[2], 5)] <- NA 

require(dplyr) 

mtcars %>% 
    mutate_if(is.na,0) 

mtcars %>% 
    mutate_if(is.na, funs(. = 0)) 

रिटर्न त्रुटि:: नीचे वाक्य रचना

Error in vapply(tbl, p, logical(1), ...) : values must be length 1, 
but FUN(X[[1]]) result is length 32 

इस कार्रवाई के लिए सही सिंटैक्स क्या है?

उत्तर

6

set उपयोग कर सकते हैं मैं purrr tutorial से इस चाल सीखा है, और यह भी में काम करता है dplyr। इस समस्या को हल करने के दो तरीके हैं: mutate_if() में,
पहले पाइप बाहर कस्टम कार्यों को परिभाषित है, और इसका इस्तेमाल करते हैं।

any_column_NA <- function(x){ 
    any(is.na(x)) 
} 
replace_NA_0 <- function(x){ 
    if_else(is.na(x),0,x) 
} 
mtcars %>% mutate_if(any_column_NA,replace_NA_0) 

दूसरा, ~, . या .x के संयोजन का उपयोग करें (.x हो सकता है . के साथ बदल दिया है, लेकिन किसी अन्य चरित्र या चिह्न) नहीं:

mtcars %>% mutate_if(~ any(is.na(.x)),~ if_else(is.na(.x),0,.x)) 
#This also works 
mtcars %>% mutate_if(~ any(is.na(.)),~ if_else(is.na(.),0,.)) 

आपके मामले में, आप भी mutate_all() उपयोग कर सकते हैं:

mtcars %>% mutate_all(~ if_else(is.na(.x),0,.x)) 

~ का उपयोग करना, हम एक गुमनाम समारोह, चर के लिए, जबकि .x या . खड़ा परिभाषित कर सकते हैं। mutate_if() मामले में, . या .x प्रत्येक कॉलम है।

21

mutate_if में "अगर" कॉलम चुनने के लिए संदर्भित करता है, पंक्तियों में नहीं। उदाहरण के लिए mutate_if(data, is.numeric, ...) का अर्थ है अपने डेटासेट में सभी संख्यात्मक कॉलम पर एक रूपांतरण करना।

आप सांख्यिक स्तंभ में शून्य से सभी NAS बदलना चाहते हैं:

data %>% mutate_if(is.numeric, funs(ifelse(is.na(.), 0, .))) 
+2

ठीक काम कर रहा है, कोई 'tidyverse' में रहने के बजाय' if_else' का उपयोग कर सकता है और सत्य, गलत प्रकार के समन्वय की अतिरिक्त जांच के लिए लाभ उठा सकता है – aurelien

2

हम से data.table

library(data.table) 
setDT(mtcars) 
for(j in seq_along(mtcars)){ 
    set(mtcars, i= which(is.na(mtcars[[j]])), j = j, value = 0) 
}