विकल्प में जोड़ने के लिए, आप भी 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 ...
जब आप डेटा में पढ़ रहे हों तो इनसे निपटने का सबसे अच्छा तरीका होगा। यदि आप मानक उपकरणों के साथ पढ़ रहे हैं तो 'na.strings' तर्क पर एक नज़र डालें। अन्यथा [यह] (http://stackoverflow.com/questions/9351089/replacing-missing-values-coded-by-in-an-r-dataframe) मदद करनी चाहिए, लेकिन एनए – user20650
के साथ अवधि को प्रतिस्थापित करें मानक क्या माना जाता है उपकरण? मैं एक एसक्यूएल डेटाबेस से सभी डेटा पढ़ रहा हूं जो डेटा – jgozal
डेटा पढ़ने के दौरान इनसे निपटने में मुश्किल हो सकता है, आप विशेष रूप से किस फ़ंक्शन का उपयोग कर रहे हैं .. सुनिश्चित करें कि उनके पास na.strings तर्क होगा – user20650