আমার কাছে একটি ডেটা ফ্রেম রয়েছে যাতে সমস্ত এনএ মান সহ কিছু কলাম রয়েছে, আমি কীভাবে সেগুলি ডেটা.ফ্রেম থেকে মুছতে পারি।
আমি কি ফাংশনটি ব্যবহার করতে পারি?
na.omit(...)
কিছু অতিরিক্ত যুক্তি উল্লেখ করে?
আমার কাছে একটি ডেটা ফ্রেম রয়েছে যাতে সমস্ত এনএ মান সহ কিছু কলাম রয়েছে, আমি কীভাবে সেগুলি ডেটা.ফ্রেম থেকে মুছতে পারি।
আমি কি ফাংশনটি ব্যবহার করতে পারি?
na.omit(...)
কিছু অতিরিক্ত যুক্তি উল্লেখ করে?
head(data)
? আপনি কি সংশ্লিষ্ট কলাম বা সারিগুলি সরাতে চান?
উত্তর:
এটি করার একটি উপায়:
df[, colSums(is.na(df)) != nrow(df)]
যদি কোনও কলামে এনএর গণনা সারি সংখ্যার সমান হয় তবে এটি অবশ্যই সম্পূর্ণ এনএ হতে হবে।
বা একইভাবে
df[colSums(!is.na(df)) > 0]
df[, colSums(is.na(df)) < nrow(df) * 0.5]
যেমন কমপক্ষে কমপক্ষে 50% নন-ফাঁকা জায়গায় কলামগুলি রাখুন।
df[, colSums(is.na(df)) != nrow(df) - 1]
1
df %>% select_if(colSums(!is.na(.)) > 0)
এখানে একটি dplyr সমাধান:
df %>% select_if(~sum(!is.na(.)) > 0)
আপডেট করুন:summarise_if()
ফাংশনের যেমন ছাপিয়ে হয় dplyr 1.0
। এখানে আরও দুটি সমাধান দেওয়া হয়েছে যা where()
পরিপাটি ফাংশনটি ব্যবহার করে :
df %>%
select(
where(
~sum(!is.na(.x)) > 0
)
)
df %>%
select(
where(
~!all(is.na(.x))
)
)
দেখে মনে হচ্ছে আপনি কেবল সমস্ত কলামগুলিই সরিয়ে ফেলতে চান এবং NA
কিছু সারি দিয়ে কলামগুলি NA
রেখেছেন। আমি এটি করব (তবে আমি নিশ্চিত যে একটি কার্যকর ভেক্টরাইজড স্যুশন রয়েছে:
#set seed for reproducibility
set.seed <- 103
df <- data.frame( id = 1:10 , nas = rep( NA , 10 ) , vals = sample( c( 1:3 , NA ) , 10 , repl = TRUE ) )
df
# id nas vals
# 1 1 NA NA
# 2 2 NA 2
# 3 3 NA 1
# 4 4 NA 2
# 5 5 NA 2
# 6 6 NA 3
# 7 7 NA 2
# 8 8 NA 3
# 9 9 NA 3
# 10 10 NA 2
#Use this command to remove columns that are entirely NA values, it will elave columns where only some vlaues are NA
df[ , ! apply( df , 2 , function(x) all(is.na(x)) ) ]
# id vals
# 1 1 NA
# 2 2 2
# 3 3 1
# 4 4 2
# 5 5 2
# 6 6 3
# 7 7 2
# 8 8 3
# 9 9 3
# 10 10 2
আপনি যদি এমন পরিস্থিতিতে নিজেকে খুঁজে পান যেখানে আপনি কোনও NA
মান রয়েছে এমন কলামগুলি মুছে ফেলতে চান তবে আপনি কেবল all
উপরের আদেশটি পরিবর্তন করতে পারেন any
।
NA
।
apply(is.na(df), 1, all)
যদিও মাত্র কারণ এটি সামান্য neater এবং is.na()
সব ব্যবহার করা হয় df
একটি সময়ে বদলে এক সারি (প্রদর্শনী একটু দ্রুততর হবে)।
একটি স্বজ্ঞামূলক স্ক্রিপ্ট: dplyr::select_if(~!all(is.na(.)))
। এটি আক্ষরিকভাবে কেবল-সমস্ত-উপাদান-অনুপস্থিত কলামগুলি রাখে। (সমস্ত উপাদান-অনুপস্থিত কলামগুলি মুছতে)।
> df <- data.frame( id = 1:10 , nas = rep( NA , 10 ) , vals = sample( c( 1:3 , NA ) , 10 , repl = TRUE ) )
> df %>% glimpse()
Observations: 10
Variables: 3
$ id <int> 1, 2, 3, 4, 5, 6, 7, 8, 9, 10
$ nas <lgl> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA
$ vals <int> NA, 1, 1, NA, 1, 1, 1, 2, 3, NA
> df %>% select_if(~!all(is.na(.)))
id vals
1 1 NA
2 2 1
3 3 1
4 4 NA
5 5 1
6 6 1
7 7 1
8 8 2
9 9 3
10 10 NA
যেহেতু পারফরম্যান্স আমার জন্য সত্যই গুরুত্বপূর্ণ ছিল, আমি উপরের সমস্ত ফাংশনগুলিকে বেঞ্চমার্ক করেছি।
দ্রষ্টব্য: @ সিমন ও'হানলনের পোস্ট থেকে ডেটা। শুধুমাত্র 10 এর পরিবর্তে 15000 আকারে।
library(tidyverse)
library(microbenchmark)
set.seed(123)
df <- data.frame(id = 1:15000,
nas = rep(NA, 15000),
vals = sample(c(1:3, NA), 15000,
repl = TRUE))
df
MadSconeF1 <- function(x) x[, colSums(is.na(x)) != nrow(x)]
MadSconeF2 <- function(x) x[colSums(!is.na(x)) > 0]
BradCannell <- function(x) x %>% select_if(~sum(!is.na(.)) > 0)
SimonOHanlon <- function(x) x[ , !apply(x, 2 ,function(y) all(is.na(y)))]
jsta <- function(x) janitor::remove_empty(x)
SiboJiang <- function(x) x %>% dplyr::select_if(~!all(is.na(.)))
akrun <- function(x) Filter(function(y) !all(is.na(y)), x)
mbm <- microbenchmark(
"MadSconeF1" = {MadSconeF1(df)},
"MadSconeF2" = {MadSconeF2(df)},
"BradCannell" = {BradCannell(df)},
"SimonOHanlon" = {SimonOHanlon(df)},
"SiboJiang" = {SiboJiang(df)},
"jsta" = {jsta(df)},
"akrun" = {akrun(df)},
times = 1000)
mbm
ফলাফল:
Unit: microseconds
expr min lq mean median uq max neval cld
MadSconeF1 154.5 178.35 257.9396 196.05 219.25 5001.0 1000 a
MadSconeF2 180.4 209.75 281.2541 226.40 251.05 6322.1 1000 a
BradCannell 2579.4 2884.90 3330.3700 3059.45 3379.30 33667.3 1000 d
SimonOHanlon 511.0 565.00 943.3089 586.45 623.65 210338.4 1000 b
SiboJiang 2558.1 2853.05 3377.6702 3010.30 3310.00 89718.0 1000 d
jsta 1544.8 1652.45 2031.5065 1706.05 1872.65 11594.9 1000 c
akrun 93.8 111.60 139.9482 121.90 135.45 3851.2 1000 a
autoplot(mbm)
mbm %>%
tbl_df() %>%
ggplot(aes(sample = time)) +
stat_qq() +
stat_qq_line() +
facet_wrap(~expr, scales = "free")