ডেটা ফ্রেমে সমস্ত নির্দিষ্ট মান প্রতিস্থাপন করুন


95

ডেটা ফ্রেম থাকা, আমি কীভাবে সমস্ত সারি এবং কলামগুলিতে সমস্ত নির্দিষ্ট মান প্রতিস্থাপন করব। উদাহরণস্বরূপ বলুন আমি সমস্ত খালি রেকর্ডগুলি 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

উত্তর:


144

এটার মত:

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

14
1 টিরও বেশি মানের জন্য দক্ষতার সাথে এটি করার কোনও উপায় আছে !?
পিক্কুকাজা

28
এটি কারণগুলির জন্য কাজ করে না, df[df=="xyz"]<-"abc""অবৈধ ফ্যাক্টর স্তর" দিয়ে ত্রুটি করবে। আরও সাধারণ সমাধান আছে কি?
4-22

4
আমার জন্য কাজ না। আমি এটি চেষ্টা করেছি: dfSmallDiscreteCustomSalary [dfSmallDiscreteCustomSalary $ বেতন == "<<50K"] <- "49 কে"। তবুও অনন্য (dfSmallDiscreteCustomSalary $ বেতন) এর জন্য আমি পাই: [1]> 50 কে <= 50 কে
কোডিয়াস-জেআর

4
গ্ল্যালেন ... আপনি যদি ইতিমধ্যে একটি ফ্যাক্টর একটি নতুন মান সহ একটি ফ্যাক্টর কলামটি সংশোধন করার চেষ্টা করছেন তবে সম্ভবত আরও চতুর উপায় আছে যা আমি প্রস্তাব করতে চলেছি, তবে আপনি ডিএফ $ ফ্যাক্টর কলাম <- as.character ( df $ factorcolumn), তারপরে আপনার পরিবর্তনটি করুন এবং এটিকে আবার ফ্যাক্টারে পরিণত করে শেষ করুন ... df $ factorcolumn <- as.factor (df $ factorcolumn); এটি আপনার নতুন স্তর এবং পছন্দসই মান দিয়ে সম্পূর্ণ হবে।
জোশুয়া এরিক টারকোট

এটি খুঁজে পেল: df.na.replace (df. কলাম, মানচিত্র ("" -> "এনএ"))। শো। মজার বিষয় হল আমি মান হিসাবে নাল দিয়ে প্রতিস্থাপন করতে পারছি না। আমি পাচ্ছি: java.lang.IllegalArgumentException: অসমর্থিত মান প্রকার java.lang.String (নাল)। org.apache.spark.sql.DataFrameNaFunctions.org $ Apache $ স্ফুলিঙ্গ $ SQL $ DataFrameNaFunctions এ $$ convertToDouble (DataFrameNaFunctions.scala: 434)
শ্রীরাম

34

যেহেতু পিক্কুকাজা এবং গ্ল্যালেন আরও সাধারণ সমাধান চেয়েছিলেন এবং আমি এখনও কোনও মন্তব্য করতে পারি না, আমি একটি উত্তর লিখব। আপনি বিবৃতি একত্রিত করতে পারেন:

> 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)

20

এখানে কয়েকটি 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'))

পুরো ডেটাসেটে এনএ দ্বারা কয়েকটি স্ট্রিং প্রতিস্থাপন করতে আপনি কীভাবে সমস্ত কলাম সমাধান ব্যবহার করতে যাবেন?
চা গাছ

4

এটি দ্রুত পেতে আমরা ডেটা টেবিল ব্যবহার করতে পারি। প্রথমে কারণ ছাড়াই ডিএফ তৈরি করুন,

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)

আপনি যদি কেবল ডেটা.ফ্রেম ব্যবহার করতে এবং কারণগুলি আরও কঠিন করে রাখতে চান তবে আপনার সাথে কাজ করা দরকার

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

যেখানে মান প্রতিটি কলামের নাম। আপনাকে এটি একটি লুপে sertোকানো দরকার।


4
আপনি কেন এই ব্যবহারের ক্ষেত্রে একটি বাহ্যিক গ্রন্থাগার ব্যবহার করবেন? এটি যদি একটি লাইন দিয়ে সমাধান করা যায় তবে একটি লুপ কেন? আপনার উত্তর ইতিমধ্যে উপস্থিত উত্তরের বাইরে মান যোগ করে? আমি কঠোর হওয়ার ইচ্ছা করি না, আমি মনে করি যে আমি কিছু অনুপস্থিত, তাই প্রশ্নগুলি।
এসডোট

4
এটি বড় ডেটাসেটের জন্য অনেক দ্রুত। এটি একটি বিকল্প যুক্ত করে যাতে ব্যবহারকারী তার জন্য সেরাটি বেছে নিতে পারে।
স্ক্যান

0

আপনি যদি কোনও ডেটা ফ্রেমে একাধিক মান প্রতিস্থাপন করতে চান তবে সমস্ত কলামের মধ্য দিয়ে লুপিং সহায়তা করতে পারে।

বলুন যে আপনি প্রতিস্থাপন করতে চান ""এবং 100:

na_codes <- c(100, "")
for (i in seq_along(df)) {
    df[[i]][df[[i]] %in% na_codes] <- NA
}
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.