मेरे पास एक डेटाफ्रेम है जो ऐसा कुछ दिखता है।

df <- tibble::tribble(
  ~name,           ~x,  ~y,              ~z,  
  "N/A",           1,   "N/A",           -100, 
  "N A",           3,   "NOt available", -99,
  "N / A",         NA,  "29",              -98,
  "Not Available", -99, "25",              -101,
  "John Smith",    -98, "28",              -1)

मैं "N/A" या "N A" वर्ण चर में सभी प्रेक्षणों को NA में बदलने के लिए map() और या data.table() का उपयोग करना चाहूंगा।

मैंने निम्नलिखित की कोशिश की है लेकिन यह काम नहीं कर रहा है:

chvar <- keep(df,is.character)%>%names()
rpl.NA<- as_mapper(~setDT(df)[.x%in%c("N/A","N A"),.x:=NA])
wrong <- map(chvar,rpl.NA)

इस दृष्टिकोण के साथ मुद्दा यह है कि यह केवल डेटाफ़्रेम वापस करने के बजाय, इसमें एकाधिक डेटाफ़्रेम वाली एक सूची तैयार करता है। मैंने भी कोशिश की है

wrong2<-df%>%mutate_at(chvar, list(~replace(., "N/A", NA)))

लेकिन यह भी एक त्रुटि पैदा करता है।

मुझे पता है कि मैं निम्नलिखित फ़ंक्शन का उपयोग करके library(naniar) के साथ ऐसा कर सकता हूं

na_strings <- c("N/A","N A")
df <- dt %>% replace_with_na_at(.vars = chvar,
                                condition = ~.x %in% na_strings)

लेकिन यह फ़ंक्शन बहुत धीमा है और मुझे इसे एक बड़े डेटासेट पर लागू करना है।

क्या कोई एक तेज़ और सुविधाजनक दृष्टिकोण जानता है जो मुझे चयनित संख्या में अवलोकनों पर एक चयनित संख्या में चर के लिए एक फ़ंक्शन लागू करने की अनुमति देता है?

आपकी सहायता के लिए धन्यवाद

सादर

1
Alex 17 पद 2020, 13:00

3 जवाब

सबसे बढ़िया उत्तर

dplyr का उपयोग करके, आप यह कर सकते हैं:

library(dplyr)
na_strings <- c("N/A","N A")

df <- df %>% 
         mutate(across(where(is.character), 
                ~replace(.x, .x %in% na_strings, NA)))

अधिक बड़ा डेटासेट data.table कुशल होगा :

library(data.table)

setDT(df)
df[, (chvar) := lapply(.SD, function(x) replace(x, x %in% na_strings, NA)), 
     .SDcols = chvar]
1
Ronak Shah 17 पद 2020, 13:05

base R में, हम कर सकते हैं

na_strings <- c("N/A","N A")
df[] <- lapply(df, function(x) replace(x, x %in% na_strings, NA))
2
akrun 17 पद 2020, 21:09

replace का उपयोग करके एक साधारण आधार R विकल्प

replace(df, df == "N/A" | df == "N A", NA)

देता है

# A tibble: 5 x 4
  name              x y                 z
  <chr>         <dbl> <chr>         <dbl>
1 <NA>              1 <NA>           -100
2 <NA>              3 NOt available   -99
3 N / A            NA 29              -98
4 Not Available   -99 25             -101
5 John Smith      -98 28               -1

यदि आपके पास NA का प्रतिनिधित्व करने वाले अधिक पैटर्न हैं, तो आप उदाहरण के लिए नीचे दिए गए कोड को आजमा सकते हैं

replace(df,Reduce(`|`, lapply(c("N/A", "N A", "N / A", "Not Available"), `==`, df)),NA)
2
ThomasIsCoding 17 पद 2020, 22:33