কিছু সংখ্যক কলাম সহ আমার একটি ডেটাফ্রেম রয়েছে। কিছু সারির 0 মান রয়েছে যা পরিসংখ্যানগত বিশ্লেষণে নাল হিসাবে বিবেচনা করা উচিত। আর-এ NUL- তে সমস্ত 0 মানটি প্রতিস্থাপনের দ্রুততম উপায় কী?
কিছু সংখ্যক কলাম সহ আমার একটি ডেটাফ্রেম রয়েছে। কিছু সারির 0 মান রয়েছে যা পরিসংখ্যানগত বিশ্লেষণে নাল হিসাবে বিবেচনা করা উচিত। আর-এ NUL- তে সমস্ত 0 মানটি প্রতিস্থাপনের দ্রুততম উপায় কী?
উত্তর:
সমস্ত শূন্যকে এনএ-তে প্রতিস্থাপন করা হচ্ছে:
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
একই আকারের একটি ম্যাট্রিক্স প্রদান করে (এটি চেষ্টা করুন) । আরও, আমাদের এই ম্যাট্রিক্সটি সাবসেটিংয়ে (দেখুন ) পাস করার অনুমতিও রয়েছে । শেষ পর্যন্ত, ফলাফলটি পুরোপুরি স্বজ্ঞাত হলেও এটি অদ্ভুত বলে মনে হতে পারে যা পছন্দসই প্রভাব দেয়। অ্যাসাইনমেন্ট অপারেটর প্রকৃতপক্ষে এতো স্মার্ট হয় না এবং কিছু অন্যান্য অবজেক্টের সাথে এইভাবে কাজ করে না, তবে এটি ডেটা ফ্রেমের সাহায্যে করে; দেখতে ।df
TRUE
FALSE
[...]
?'['
df[df == 0]
df[df == 0] <- NA
<-
?'<-'
1 সেট তত্ত্বের খালি সেটটি কোনওভাবে সম্পর্কিত বলে মনে করে।
2 সেট তত্ত্বের সাথে আর একটি মিল: খালি সেটটি প্রতিটি সেটের একটি উপসেট, তবে আমরা এর জন্য কোনও স্থান সংরক্ষণ করি না।
আমাকে ধরে নিই যে আপনার ডেটা.ফ্রেমটি বিভিন্ন ডেটাটাইপগুলির মিশ্রণ এবং সমস্ত কলাম পরিবর্তন করার দরকার নেই।
শুধুমাত্র 12 থেকে 18 (মোট 21 টি) কলাম পরিবর্তন করতে, কেবল এটি করুন
df[, 12:18][df[, 12:18] == 0] <- NA
[<-
ফাংশন ব্যতীত বিকল্প উপায় :
একটি নমুনা ডেটা ফ্রেম 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
#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
যেহেতু কেউ এর ডেটা.সামগ্রী সংস্করণ জিজ্ঞাসা করেছে এবং প্রদত্ত ডেটা.ফ্রেমে সমাধান ডেটা.ট্যাবলের সাথে কাজ করে না, তাই আমি নীচের সমাধানটি সরবরাহ করছি।
মূলত, :=
অপারেটরটি ব্যবহার করুন ->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
আপনি প্রতিস্থাপন করতে পারেন 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)
।
1:5
সঙ্গে 1:ncol(df)
শেষে। আমি সমীকরণটিকে অতিরিক্ত জটিল বা পড়তে অসুবিধা করতে চাইনি।
1:5
কলাম সংখ্যাটি পরিবর্তন চান, মতো 12:15
, কিন্তু যদি আপনি নিশ্চিত করছেন যে এটি শুধুমাত্র সাংখ্যিক কলাম প্রভাবিত করবে চেয়েছিলেন তারপর শুধু একটি যদি বিবৃতিতে ফাংশনের দ্বিতীয় লাইন মোড়ানো, এরকম: if (is.numeric(col)) { col[col == -1 & is.numeric(col)] <- NA }
।