डेटा फ्रेम में सभी विशेष मान बदलें


88

डेटा फ़्रेम होने के बाद, मैं सभी पंक्तियों और स्तंभों के साथ सभी विशिष्ट मानों को प्रतिस्थापित करने के बारे में कैसे जाना है। उदाहरण के लिए कहो कि मैं सभी खाली रिकॉर्ड को बदलना चाहता हूं NA(पदों को टाइप किए बिना):

df <- data.frame(list(A=c("", "xyz", "jkl"), B=c(12, "", 100)))

    A   B
1      12
2  xyz    
3  jkl 100

अपेक्षित परिणाम:

    A   B
1  NA   12
2  xyz  NA  
3  jkl  100

जवाबों:


138

इस कदर:

> df[df==""]<-NA
> df
     A    B
1 <NA>   12
2  xyz <NA>
3  jkl  100

14
वहाँ 1 से अधिक मूल्य के लिए कुशलता से ऐसा करने का एक तरीका है !?
पिककुकटजा

28
यह कारकों के लिए काम नहीं करता है, df[df=="xyz"]<-"abc""अमान्य कारक स्तर" के साथ त्रुटि करेगा। क्या अधिक सामान्य समाधान है?
बजे

1
मेरे लिए काम नहीं कर रहा। मैंने यह कोशिश की: dfSmallDiscreteCustomSalary [dfSmallDiscreteCustomSalary $ वेतन == "<= 50K"] <- "49K"। अभी भी अद्वितीय के लिए (dfSmallDiscreteCustomSalary $ वेतन) मुझे मिलता है: [1]> 50K <= 50K
कोडियस-जेआर

3
glallen ... यदि आप एक कारक स्तंभ को नए मान के साथ संशोधित करने का प्रयास कर रहे हैं जो पहले से ही एक कारक है, तो शायद अधिक चतुर तरीके हैं जो मैं सुझाव देने वाला हूं, लेकिन आप $ फ़ैक्टरकॉलफ़ <- asracter () कर सकते हैं df $ फ़ैक्टरकैल्यूम), फिर अपना संशोधन करें, और इसे फिर से एक फैक्टर में बदलकर समाप्त करें ... df $ फ़ैक्टरकल्म <- as.factor (df $ फ़ैक्टरकॉल्यूम); यह आपके नए स्तर और वांछित मूल्य के साथ पूरा होगा।
जोशुआ एरिक टर्कोट

यह पता चला: df.na.replace (df.columns, Map ("" -> "NA")। दिलचस्प है कि मैं मूल्य के रूप में अशक्त के साथ प्रतिस्थापित करने में सक्षम नहीं हूं। मुझे मिल रहा है: java.lang.IllegalArgumentException: असमर्थित मान प्रकार java.lang.String (नल)। org.apache.spark.sql.DataFrameNaFunctions.org $ अपाचे $ चिंगारी $ एसक्यूएल $ DataFrameNaFunctions पर $$ convertToDouble (DataFrameNaFunctions.scala: 434)
श्रीराम

34

चूँकि PikkuKatja और glallen ने एक अधिक सामान्य समाधान के लिए कहा और मैं अभी तक टिप्पणी नहीं कर सकता, मैं एक उत्तर लिखूंगा। आप इस प्रकार कथन जोड़ सकते हैं:

> df[df=="" | df==12] <- NA
> df
     A    B
1  <NA> <NA>
2  xyz  <NA>
3  jkl  100

कारकों के लिए, zxzak का कोड पहले से ही कारक देता है:

> df <- data.frame(list(A=c("","xyz","jkl"), B=c(12,"",100)))
> str(df)
'data.frame':   3 obs. of  2 variables:
 $ A: Factor w/ 3 levels "","jkl","xyz": 1 3 2
 $ B: Factor w/ 3 levels "","100","12": 3 1 2

यदि समस्या है, तो मैं अस्थायी रूप से कारकों को छोड़ने का सुझाव दूंगा।

df[] <- lapply(df, as.character)

18

यहाँ कुछ dplyrविकल्प दिए गए हैं :

library(dplyr)

# all columns:
df %>% 
  mutate_all(~na_if(., ''))

# specific column types:
df %>% 
  mutate_if(is.factor, ~na_if(., ''))

# specific columns:  
df %>% 
  mutate_at(vars(A, B), ~na_if(., ''))

# or:
df %>% 
  mutate(A = replace(A, A == '', NA))

# replace can be used if you want something other than NA:
df %>% 
  mutate(A = as.character(A)) %>% 
  mutate(A = replace(A, A == '', 'used to be empty'))

आप संपूर्ण डेटासेट में NA द्वारा कई स्ट्रिंग्स को बदलने के लिए सभी कॉलम समाधान का उपयोग करने के बारे में कैसे जाएंगे?
चाय ट्री

4

हम इसे जल्दी से प्राप्त करने के लिए data.table का उपयोग कर सकते हैं। पहले कारकों के बिना डीएफ बनाएं,

df <- data.frame(list(A=c("","xyz","jkl"), B=c(12,"",100)), stringsAsFactors=F)

अब आप उपयोग कर सकते हैं

setDT(df)
for (jj in 1:ncol(df)) set(df, i = which(df[[jj]]==""), j = jj, v = NA)

और आप इसे वापस डेटा में बदल सकते हैं

setDF(df)

यदि आप केवल data.frame का उपयोग करना चाहते हैं और उन कारकों को रखना है जो अधिक कठिन हैं, तो आपको काम करने की आवश्यकता है

levels(df$value)[levels(df$value)==""] <- NA

जहाँ मान हर स्तंभ का नाम है। आपको इसे लूप में सम्मिलित करने की आवश्यकता है।


2
आप इस उपयोग के मामले में बाहरी पुस्तकालय का उपयोग क्यों करेंगे? क्यों एक लूप अगर यह एक लाइन के साथ हल किया जा सकता है? आपके उत्तर पहले से मौजूद उत्तरों से अधिक मूल्य कैसे जोड़ते हैं? मुझे कठोर होने का इरादा नहीं है, मुझे लगता है कि मैं कुछ याद कर रहा हूं, इसलिए सवाल।
sedot

2
यह बड़े डेटासेट के लिए बहुत तेज़ है। यह एक विकल्प जोड़ता है ताकि उपयोगकर्ता उसके लिए सबसे अच्छा चुन सके।
स्कैन

0

यदि आप एक डेटा फ्रेम में कई मूल्यों को बदलना चाहते हैं, तो सभी कॉलमों के माध्यम से लूपिंग मदद कर सकता है।

कहो कि आप बदलना चाहते हैं ""और 100:

na_codes <- c(100, "")
for (i in seq_along(df)) {
    df[[i]][df[[i]] %in% na_codes] <- NA
}
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.