কোনও ভেক্টর থেকে এনএ মানগুলি সরান


191

আমার একটি বিশাল ভেক্টর রয়েছে যার কয়েকটি NAমান রয়েছে এবং আমি সেই ভেক্টরের সর্বাধিক মান সন্ধান করার চেষ্টা করছি (ভেক্টরটি সমস্ত সংখ্যা) তবে NAমানগুলির কারণে আমি এটি করতে পারি না ।

আমি কীভাবে NAমানগুলি সরিয়ে ফেলব যাতে আমি সর্বোচ্চটি গণনা করতে পারি?

উত্তর:


265

চেষ্টা করা ?max, আপনি দেখতে পাবেন যে এটির আসলে একটি na.rm =যুক্তি রয়েছে, এটি ডিফল্টরূপে সেট করা হয়েছে FALSE। (সহ অন্যান্য অনেক আর ফাংশন, সাধারণ ডিফল্ট এর sum(), mean()ইত্যাদি)

na.rm=TRUEআপনি যা চান সেটিং ঠিক তেমন করে:

d <- c(1, 100, NA, 10)
max(d, na.rm=TRUE)

আপনি যদি সমস্ত NAগুলি মুছে ফেলতে চান তবে পরিবর্তে এই প্রতিমাটি ব্যবহার করুন:

d <- d[!is.na(d)]

একটি চূড়ান্ত নোট: অন্যান্য ফাংশন (যেমন table(), lm()এবং sort()) NA-র সাথে সম্পর্কিত যুক্তি রয়েছে যা বিভিন্ন নাম ব্যবহার করে (এবং বিভিন্ন বিকল্প প্রস্তাব দেয়)। সুতরাং যদি NAকোনও ফাংশন কলে আপনাকে সমস্যা সৃষ্টি করে তবে ফাংশনের যুক্তিগুলির মধ্যে অন্তর্নির্মিত সমাধানটি পরীক্ষা করা উপযুক্ত। আমি খুঁজে পেয়েছি সেখানে ইতিমধ্যে একটি সাধারণত আছে।


এটি একটি খুব খারাপ ধারণা। এটি ব্যর্থ হয় এবং সমস্ত এনএ এর -Infজন্য দেয় d
ব্যবহারকারী 393232000

@ ব্যবহারকারী 393232000 অন্যের কাছে পরিষ্কার হওয়ার জন্য, আপনার অভিযোগটি বেস আর ফাংশনটি কীভাবে max()আচরণ করে (উদাহরণস্বরূপ, কাজ করার সময় max(c(NA, NA)) সম্পর্কে is ব্যক্তিগতভাবে, আমি মনে করি এটির আচরণ যুক্তিসঙ্গত; আমি আশা করি এটি সেভাবে নির্মিত হয়েছিল যাতে আপনি যখন যেমন কাজগুলি করেন তখন প্রত্যাশিত ফলাফল পানa <- c(NA, NA); b <- 1:4; max(c(max(a, na.rm = TRUE), max(b, na.rm = TRUE)))
জোশ ওব্রায়ান

@ ব্যবহারকারী 393232000 কিছুটা স্পর্শকাতরভাবে, ডেটা বিশ্লেষণ প্ল্যাটফর্ম হিসাবে আর এর অনেক শক্তিগুলির মধ্যে একটি হ'ল এটি হারিয়ে যাওয়া তথ্যের পরিশীলিত হ্যান্ডলিং , এটির লেখকদের পক্ষ থেকে অনেক সতর্ক চিন্তার ফল । (আপনি যদি এই বিষয়ে আগ্রহী হন তবে জড়িত কিছু বিষয় সম্পর্কে ভাল আলোচনার জন্য এখানে দেখুন, প্রোগ্রামারদের দৃষ্টিকোণ থেকে যারা NAপাইথনের চমৎকার নুমপি প্যাকেজে আর-এর মতো হ্যান্ডলিং সুবিধাগুলি অন্তর্ভুক্ত করার জন্য নিযুক্ত ছিলেন ।)
জোশ ও'ব্রায়েন

@ ব্যবহারকারী 393232000: উত্তরটি কি সত্যিই খারাপ? নাল সেটটির সর্বাধিক কী বিবেচনা করবেন?
ক্লিফ এবি

@ ক্লিফ্যাব এটির সর্বোচ্চ নেই। আপনি সর্বোচ্চটি-। (এবং কমপক্ষে + + হতে হবে) নির্ধারণ করতে পারেন তবে এটি সর্বদা পছন্দসই বা স্বজ্ঞাত নয়। এছাড়াও, যখন আপনি NAs এর কোনও ভেক্টর থেকে সমস্ত সরিয়ে ফেলেন NA, আপনি খালি ভেক্টরের প্রত্যাশা করবেন, না ∞
ব্যবহারকারী 393232000

94

na.omitফাংশন কি রিগ্রেশন রুটিন অনেকটা অভ্যন্তরীণভাবে ব্যবহার:

vec <- 1:1000
vec[runif(200, 1, 1000)] <- NA
max(vec)
#[1] NA
max( na.omit(vec) )
#[1] 1000

20

?maxআপনাকে দেখায় যে একটি অতিরিক্ত প্যারামিটার রয়েছে na.rmযা আপনি সেট করতে পারেন TRUE

এগুলি ছাড়াও, যদি আপনি সত্যিই এসগুলি সরাতে চান তবে NAকেবল এই জাতীয় কিছু ব্যবহার করুন:

myvec[!is.na(myvec)]

3
আমি মনে করি এটি সেরা। na.rm এবং na.omit আউটপুটে বেশ খানিকটা জাঙ্ক যোগ করে।
ম্যাডম্যানলি

ছাড়া na.omitএকটি dataframe পদ্ধতি আছে, তাই আরও সাধারণ হয়।
আইআরটিএফএম


14

কেবলমাত্র যদি আর এ নতুন কেউ আসল প্রশ্নের একটি সরল উত্তর চান wants

আমি কীভাবে কোনও ভেক্টর থেকে এনএ মানগুলি সরিয়ে ফেলতে পারি?

এটা এখানে:

ধরে নিন আপনার নীচে fooযেমন ভেক্টর রয়েছে :

foo = c(1:10, NA, 20:30)

চলমান length(foo)22 দেয়।

nona_foo = foo[!is.na(foo)]

length(nona_foo) 21, কারণ এনএ মানগুলি সরানো হয়েছে।

মনে রাখবেন is.na(foo)একটি বুলিয়ান ম্যাট্রিক্স প্রদান করে, সুতরাং fooএই মানের বিপরীতে সূচীকরণ আপনাকে সমস্ত উপাদান দেবে যা এনএ নয়।


13

Purrrdiscard থেকে ব্যবহার (তালিকা এবং ভেক্টরগুলির সাথে কাজ করে)।

discard(v, is.na) 

সুবিধাটি হ'ল পাইপগুলি ব্যবহার করা সহজ; বিকল্পভাবে অন্তর্নির্মিত সাবসেটিং ফাংশনটি ব্যবহার করুন [:

v %>% discard(is.na)
v %>% `[`(!is.na(.))

নোটগুলি যে na.omitতালিকায় কাজ করে না:

> x <- list(a=1, b=2, c=NA)
> na.omit(x)
$a
[1] 1

$b
[1] 2

$c
[1] NA

1

আমি দুটি baseপদ্ধতির তুলনা করে একটি দ্রুত বেঞ্চমার্ক চালিয়েছি এবং এটির x[!is.na(x)]চেয়ে দ্রুতগতিতে দেখা যাচ্ছে na.omit। ব্যবহারকারী qwrপরামর্শ দিয়েছিলেন আমিও চেষ্টা করে দেখি purrr::dicard- এটি ব্যাপকভাবে ধীর হয়ে উঠেছে (যদিও আমি আনন্দের সাথে আমার প্রয়োগ ও পরীক্ষার বিষয়ে মন্তব্য করব!)

microbenchmark::microbenchmark(
  purrr::map(airquality,function(x) {x[!is.na(x)]}), 
  purrr::map(airquality,na.omit),
  purrr::map(airquality, ~purrr::discard(.x, .p = is.na)),
  times = 1e6)

Unit: microseconds
                                                     expr    min     lq      mean median      uq       max neval cld
 purrr::map(airquality, function(x) {     x[!is.na(x)] })   66.8   75.9  130.5643   86.2  131.80  541125.5 1e+06 a  
                          purrr::map(airquality, na.omit)   95.7  107.4  185.5108  129.3  190.50  534795.5 1e+06  b 
  purrr::map(airquality, ~purrr::discard(.x, .p = is.na)) 3391.7 3648.6 5615.8965 4079.7 6486.45 1121975.4 1e+06   c

রেফারেন্সের জন্য, এখানে x[!is.na(x)]বনামের আসল পরীক্ষাটি এখানে na.omit:

microbenchmark::microbenchmark(
    purrr::map(airquality,function(x) {x[!is.na(x)]}), 
    purrr::map(airquality,na.omit), 
    times = 1000000)


Unit: microseconds
                                              expr  min   lq      mean median    uq      max neval cld
 map(airquality, function(x) {     x[!is.na(x)] }) 53.0 56.6  86.48231   58.1  64.8 414195.2 1e+06  a 
                          map(airquality, na.omit) 85.3 90.4 134.49964   92.5 104.9 348352.8 1e+06   b

আপনার চেষ্টা করা উচিতpurrr:discard
Qwr
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.