2016-01-02 10 views
6

मेरे डेटाफ्रेम में कुछ चर हैं जिनमें "NA" जैसे तारों के रूप में अनुपलब्ध मान हैं। डेटाफ्रेम में सभी स्तंभों को पार्स करने का सबसे प्रभावी तरीका क्या है जिसमें इन्हें शामिल किया गया है और उन्हें वास्तविक NAs में परिवर्तित किया गया है जो is.na() जैसे कार्यों से प्राप्त होते हैं?"एनए" तारों से बाहर उद्धरण उद्धरण

मैं डेटाबेस से पूछताछ के लिए sqldf का उपयोग कर रहा हूं।

प्रतिलिपि प्रस्तुत करने योग्य उदाहरण:

तो यह विशेष स्थिति के लिए यह सिर्फ होगा::

df[df=="NA"]<-NA 

यह केवल ले लिया

vect1 <- c("NA", "NA", "BANANA", "HELLO") 
vect2 <- c("NA", 1, 5, "NA") 
vect3 <- c(NA, NA, "NA", "NA") 


df = data.frame(vect1,vect2,vect3) 
+5

जब आप डेटा में पढ़ रहे हों तो इनसे निपटने का सबसे अच्छा तरीका होगा। यदि आप मानक उपकरणों के साथ पढ़ रहे हैं तो 'na.strings' तर्क पर एक नज़र डालें। अन्यथा [यह] (http://stackoverflow.com/questions/9351089/replacing-missing-values-coded-by-in-an-r-dataframe) मदद करनी चाहिए, लेकिन एनए – user20650

+0

के साथ अवधि को प्रतिस्थापित करें मानक क्या माना जाता है उपकरण? मैं एक एसक्यूएल डेटाबेस से सभी डेटा पढ़ रहा हूं जो डेटा – jgozal

+0

डेटा पढ़ने के दौरान इनसे निपटने में मुश्किल हो सकता है, आप विशेष रूप से किस फ़ंक्शन का उपयोग कर रहे हैं .. सुनिश्चित करें कि उनके पास na.strings तर्क होगा – user20650

उत्तर

5

विकल्प में जोड़ने के लिए, आप भी replace बजाय ठेठ blah[index] <- NA दृष्टिकोण का उपयोग कर सकते हैं। replace देखने की तरह होगा:

df <- replace(df, df == "NA", NA) 

एक अन्य विकल्प पर विचार करने के type.convert है। यह वह कार्य है जो R स्वचालित रूप से कॉलम प्रकारों को परिवर्तित करने के लिए डेटा पढ़ने के दौरान उपयोग करता है। इस प्रकार, परिणाम उसमें आपके वर्तमान दृष्टिकोण से अलग है, उदाहरण के लिए, दूसरा कॉलम संख्यात्मक रूपांतरित हो जाता है।

df[] <- lapply(df, function(x) type.convert(as.character(x), na.strings = "NA")) 
df 

यहाँ एक प्रदर्शन की तुलना है। नमूना डेटा @ रोलैंड के उत्तर से है।

यहां परीक्षण का कार्य हैं:

funop <- function() { 
    df[df == "NA"] <- NA 
    df 
} 

funr <- function() { 
    ind <- which(vapply(df, function(x) class(x) %in% c("character", "factor"), FUN.VALUE = TRUE)) 
    as.data.table(df)[, names(df)[ind] := lapply(.SD, function(x) { 
    is.na(x) <- x == "NA" 
    x 
    }), .SDcols = ind][] 
} 

funam1 <- function() replace(df, df == "NA", NA) 

funam2 <- function() { 
    df[] <- lapply(df, function(x) type.convert(as.character(x), na.strings = "NA")) 
    df 
} 

यहाँ बेंच मार्किंग है:

library(microbenchmark) 
microbenchmark(funop(), funr(), funam1(), funam2(), times = 10) 
# Unit: seconds 
#  expr  min  lq  mean median  uq  max neval 
# funop() 3.629832 3.750853 3.909333 3.855636 4.098086 4.248287 10 
# funr() 3.074825 3.212499 3.320430 3.279268 3.332304 3.685837 10 
# funam1() 3.714561 3.899456 4.238785 4.065496 4.280626 5.512706 10 
# funam2() 1.391315 1.455366 1.623267 1.566486 1.606694 2.253258 10 

replace जो @ jgozal के रूप में ही है, @ रॉलेंड के दृष्टिकोण के रूप में ही किया जाएगा। हालांकि, type.convert दृष्टिकोण के परिणामस्वरूप विभिन्न कॉलम प्रकार होंगे।

all.equal(funop(), setDF(funr())) 
all.equal(funop(), funam()) 

str(funop()) 
# 'data.frame': 10000000 obs. of 3 variables: 
# $ vect1: Factor w/ 3 levels "BANANA","HELLO",..: 2 2 NA 2 1 1 1 NA 1 1 ... 
# $ vect2: Factor w/ 3 levels "1","5","NA": NA 2 1 NA 1 NA NA 1 NA 2 ... 
# $ vect3: Factor w/ 1 level "NA": NA NA NA NA NA NA NA NA NA NA ... 

str(funam2()) 
# 'data.frame': 10000000 obs. of 3 variables: 
# $ vect1: Factor w/ 2 levels "BANANA","HELLO": 2 2 NA 2 1 1 1 NA 1 1 ... 
# $ vect2: int NA 5 1 NA 1 NA NA 1 NA 5 ... 
# $ vect3: logi NA NA NA NA NA NA ... 
4

मैं this प्रश्न से यह कर के यह अच्छा रास्ता मिल गया 5 मिलियन पंक्तियों के साथ लगभग 30 सेकंड और ~ 250 चर

+0

आप पैकेज डेटाटेबल का उपयोग करके इसे बहुत तेज़ कर सकते हैं। लेकिन आप 'डीएफ' का पुनरुत्पादित उदाहरण प्रदान नहीं करते हैं, जो मुझे जवाब देने और परीक्षण/बेंचमार्किंग से रोकता है। – Roland

+0

पुनरुत्पादित उदाहरण जोड़ा गया – jgozal

4

यह है थोड़ा तेज:

set.seed(42) 
df <- do.call(data.frame, lapply(df, sample, size = 1e7, replace = TRUE)) 
df2 <- df 
system.time(df[df=="NA"]<-NA) 
# user  system  elapsed 
#3.601  0.378  3.984 

library(data.table) 
setDT(df2) 
system.time({ 
    #find character and factor columns 
    ind <- which(vapply(df2, function(x) class(x) %in% c("character", "factor"), FUN.VALUE = TRUE)) 
    #assign by reference 
    df2[, names(df2)[ind] := lapply(.SD, function(x) { 
    is.na(x) <- x == "NA" 
    x 
}), .SDcols = ind] 
}) 
# user  system  elapsed 
#2.484  0.190  2.676 
all.equal(df, setDF(df2)) 
#[1] TRUE