সমস্ত 0 মান NA এ প্রতিস্থাপন করুন


144

কিছু সংখ্যক কলাম সহ আমার একটি ডেটাফ্রেম রয়েছে। কিছু সারির 0 মান রয়েছে যা পরিসংখ্যানগত বিশ্লেষণে নাল হিসাবে বিবেচনা করা উচিত। আর-এ NUL- তে সমস্ত 0 মানটি প্রতিস্থাপনের দ্রুততম উপায় কী?


17
আমি মনে করি না আপনি NULL মানগুলির সাথে প্রতিস্থাপন করতে পারবেন / না, তবে এনএ আর লিংগোতে সেই উদ্দেশ্যে কাজ করে।
চেজ

উত্তর:


243

সমস্ত শূন্যকে এনএ-তে প্রতিস্থাপন করা হচ্ছে:

df[df == 0] <- NA



ব্যাখ্যা

1.NULL আপনার সাথে শূন্যগুলি প্রতিস্থাপন করা উচিত তা নয় । যেমন এটিতে বলা হয়েছে ?'NULL',

NULL R এ নাল বস্তুর প্রতিনিধিত্ব করে

যা অনন্য এবং আমার ধারণা, সর্বাধিক তথ্যহীন এবং খালি বস্তু হিসাবে দেখা যেতে পারে। 1 তারপরে এটি এত অবাক হয় না

data.frame(x = c(1, NULL, 2))
#   x
# 1 1
# 2 2

অর্থাৎ, এই নাল বস্তুর জন্য আর কোনও স্থান সংরক্ষণ করে না। 2 ইতিমধ্যে, ?'NA'আমরা এটি দেখতে

এনএ হ'ল দৈর্ঘ্যের একটি লজিকাল ধ্রুবক যাতে অনুপস্থিত মান সূচক রয়েছে। কাঁচা ব্যতীত অন্য কোনও ভেক্টর প্রকারে এনএ জোর করা যেতে পারে।

গুরুত্বপূর্ণভাবে, NAদৈর্ঘ্য 1 এর যাতে আর এর জন্য কিছু জায়গা সংরক্ষণ করে। যেমন,

data.frame(x = c(1, NA, 2))
#    x
# 1  1
# 2 NA
# 3  2

এছাড়াও, ডেটা ফ্রেম কাঠামোতে সমস্ত কলামগুলিতে একই সংখ্যক উপাদান থাকা দরকার যাতে কোনও "ছিদ্র" (যেমন, NULLমান) না থাকে।

NULLকমপক্ষে একটি শূন্যযুক্ত সমস্ত সারি সম্পূর্ণ অপসারণের অর্থে আপনি এখন ডেটা ফ্রেমে জিরোগুলি প্রতিস্থাপন করতে পারেন । যখন ব্যবহার করে, যেমন, var, cov, অথবা cor, যে আসলে সমতুল্য প্রথম শূণ্যসমূহ প্রতিস্থাপন হয় NAএবং মূল্য জন্য উপলব্ধ সেটিং useহিসাবে "complete.obs"। সাধারণত, এটি অসন্তুষ্টিজনক কারণ এটি অতিরিক্ত তথ্য ক্ষতির দিকে নিয়ে যায়।

2. কোনও ধরণের লুপ চালানোর পরিবর্তে সমাধানে আমি df == 0ভেক্টরাইজেশন ব্যবহার করি । এন্ট্রি এবং দিয়ে df == 0একই আকারের একটি ম্যাট্রিক্স প্রদান করে (এটি চেষ্টা করুন) । আরও, আমাদের এই ম্যাট্রিক্সটি সাবসেটিংয়ে (দেখুন ) পাস করার অনুমতিও রয়েছে । শেষ পর্যন্ত, ফলাফলটি পুরোপুরি স্বজ্ঞাত হলেও এটি অদ্ভুত বলে মনে হতে পারে যা পছন্দসই প্রভাব দেয়। অ্যাসাইনমেন্ট অপারেটর প্রকৃতপক্ষে এতো স্মার্ট হয় না এবং কিছু অন্যান্য অবজেক্টের সাথে এইভাবে কাজ করে না, তবে এটি ডেটা ফ্রেমের সাহায্যে করে; দেখতে ।dfTRUEFALSE[...]?'['df[df == 0]df[df == 0] <- NA<-?'<-'


1 সেট তত্ত্বের খালি সেটটি কোনওভাবে সম্পর্কিত বলে মনে করে।
2 সেট তত্ত্বের সাথে আর একটি মিল: খালি সেটটি প্রতিটি সেটের একটি উপসেট, তবে আমরা এর জন্য কোনও স্থান সংরক্ষণ করি না।


3
ডেটা.টিবল অবজেক্টের জন্য সমতুল্য বাক্য গঠন কী হবে?
itpetersen

6
আমি দেখতে পেয়েছি যে আপনি প্রচুর ভোট পেয়েছেন তবে মনে হয় না যে এটি "0" এর মান সহ অ-সংখ্যািক কলামগুলির প্রান্তের কেসগুলি যথাযথভাবে কভার করে যা যা <NA> তে সেট করার জন্য অনুরোধ করা হয়নি।
আইআরটিএফএম

33

আমাকে ধরে নিই যে আপনার ডেটা.ফ্রেমটি বিভিন্ন ডেটাটাইপগুলির মিশ্রণ এবং সমস্ত কলাম পরিবর্তন করার দরকার নেই।

শুধুমাত্র 12 থেকে 18 (মোট 21 টি) কলাম পরিবর্তন করতে, কেবল এটি করুন

df[, 12:18][df[, 12:18] == 0] <- NA

এটি আমার পক্ষে কাজ করে, যদিও স্বীকৃত উত্তরটি দেয় না
প্যাট্রিক কৌলম্বে

23

[<-ফাংশন ব্যতীত বিকল্প উপায় :

একটি নমুনা ডেটা ফ্রেম dat(নির্লজ্জভাবে @ চেসের উত্তর থেকে অনুলিপি করা হয়েছে):

dat

  x y
1 0 2
2 1 2
3 1 1
4 2 1
5 0 0

জিরোগুলি ফাংশন NAদ্বারা প্রতিস্থাপন করা যেতে পারে is.na<-:

is.na(dat) <- !dat


dat

   x  y
1 NA  2
2  1  2
3  1  1
4  2  1
5 NA NA

22

dplyr::na_if() একটি বিকল্প:

library(dplyr)  

df <- data_frame(col1 = c(1, 2, 3, 0),
                 col2 = c(0, 2, 3, 4),
                 col3 = c(1, 0, 3, 0),
                 col4 = c('a', 'b', 'c', 'd'))

na_if(df, 0)
# A tibble: 4 x 4
   col1  col2  col3 col4 
  <dbl> <dbl> <dbl> <chr>
1     1    NA     1 a    
2     2     2    NA b    
3     3     3     3 c    
4    NA     4    NA d

14
#Sample data
set.seed(1)
dat <- data.frame(x = sample(0:2, 5, TRUE), y = sample(0:2, 5, TRUE))
#-----
  x y
1 0 2
2 1 2
3 1 1
4 2 1
5 0 0

#replace zeros with NA
dat[dat==0] <- NA
#-----
   x  y
1 NA  2
2  1  2
3  1  1
4  2  1
5 NA NA

12

যেহেতু কেউ এর ডেটা.সামগ্রী সংস্করণ জিজ্ঞাসা করেছে এবং প্রদত্ত ডেটা.ফ্রেমে সমাধান ডেটা.ট্যাবলের সাথে কাজ করে না, তাই আমি নীচের সমাধানটি সরবরাহ করছি।

মূলত, :=অপারেটরটি ব্যবহার করুন ->DT[x == 0, x := NA]

library("data.table")

status = as.data.table(occupationalStatus)

head(status, 10)
    origin destination  N
 1:      1           1 50
 2:      2           1 16
 3:      3           1 12
 4:      4           1 11
 5:      5           1  2
 6:      6           1 12
 7:      7           1  0
 8:      8           1  0
 9:      1           2 19
10:      2           2 40


status[N == 0, N := NA]

head(status, 10)
    origin destination  N
 1:      1           1 50
 2:      2           1 16
 3:      3           1 12
 4:      4           1 11
 5:      5           1  2
 6:      6           1 12
 7:      7           1 NA
 8:      8           1 NA
 9:      1           2 19
10:      2           2 40

2
বা for (j in names(DT)); set(DT,which(DT[[j]] == 0),j,NA)। মানগুলি অনুসন্ধান এবং প্রতিস্থাপনের জন্য ডেটা ব্যবহারের আরও বিশদ আলোচনার জন্য এখানে দেখুন ।
জেভিলিমান

4

আপনি প্রতিস্থাপন করতে পারেন 0সঙ্গে NAশুধুমাত্র সাংখ্যিক ক্ষেত্রের মধ্যে (অর্থাত কারণের ভালো জিনিস বাদে), কিন্তু এটা একটি কলাম বাই-কলাম ভিত্তিতে কাজ করে:

col[col == 0 & is.numeric(col)] <- NA

একটি ফাংশন সহ, আপনি এটি আপনার পুরো ডেটা ফ্রেমে প্রয়োগ করতে পারেন:

changetoNA <- function(colnum,df) {
    col <- df[,colnum]
    if (is.numeric(col)) {  #edit: verifying column is numeric
        col[col == -1 & is.numeric(col)] <- NA
    }
    return(col)
}
df <- data.frame(sapply(1:5, changetoNA, df))

যদিও আপনি 1:5আপনার ডেটা ফ্রেমে কলামগুলির সংখ্যার সাথে বা এর সাথে প্রতিস্থাপন করতে পারেন 1:ncol(df)


আমি নিশ্চিত না এটি সঠিক সমাধান। 6 এবং আরও বেশি কলাম সম্পর্কে What তারা কাটা হবে।
ব্যবহারকারী জেটি

এটা কেন আমি প্রতিস্থাপন প্রস্তাব দেওয়া হচ্ছে 1:5সঙ্গে 1:ncol(df)শেষে। আমি সমীকরণটিকে অতিরিক্ত জটিল বা পড়তে অসুবিধা করতে চাইনি।
Alium ব্রিট

তবে 6 এবং 7 কলামগুলিতে কী হয় - ডেটাটাইপটি চর এবং কোনও প্রতিস্থাপন করা উচিত নয়। আমার সমস্যায়, আমার কেবল 12 থেকে 15 কলামগুলিতে প্রতিস্থাপন দরকার তবে পুরো ডিএফের 21 টি কলাম রয়েছে (অনেকগুলি অবশ্যই একেবারে স্পর্শ করা উচিত নয়)।
ব্যবহারকারী জেটি

আপনার ডেটা ফ্রেমের জন্য আপনি শুধু পরিবর্তন হতে পারে 1:5কলাম সংখ্যাটি পরিবর্তন চান, মতো 12:15, কিন্তু যদি আপনি নিশ্চিত করছেন যে এটি শুধুমাত্র সাংখ্যিক কলাম প্রভাবিত করবে চেয়েছিলেন তারপর শুধু একটি যদি বিবৃতিতে ফাংশনের দ্বিতীয় লাইন মোড়ানো, এরকম: if (is.numeric(col)) { col[col == -1 & is.numeric(col)] <- NA }
অ্যালিয়াম ব্রিট

0

গুগলের মাধ্যমে যে কেউ এখানে পৌঁছে বিপরীত সন্ধানের জন্য (যেমন কীভাবে একটি ডাটা-ফ্রেমে সমস্ত এনএ প্রতিস্থাপন করবেন 0 এর সাথে ফ্রেম), উত্তরটি হ'ল

df[is.na(df)] <- 0

অথবা

Dplyr / tidyverse ব্যবহার করে

library(dplyr)
mtcars %>% replace(is.na(.), 0)
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.