উত্তর:
এটা চেষ্টা কর:
df <- df[,colSums(is.na(df))<nrow(df)]
প্রস্তাবিত দুটি পন্থাগুলি তাদের তৈরি বড় মাপের ডেটা সেটগুলির সাথে ব্যর্থ হয়েছে (অন্যান্য মেমরি সমস্যার মধ্যে রয়েছে) is.na(df)
যা কোনও আকারের আকার হিসাবে হবে df
।
এখানে দুটি পন্থা যা বেশি স্মৃতি এবং সময় দক্ষ
একটি পদ্ধতির ব্যবহার Filter
Filter(function(x)!all(is.na(x)), df)
এবং ডেটা টেবিল ব্যবহার করে একটি পদ্ধতির (সাধারণ সময় এবং মেমরির দক্ষতার জন্য)
library(data.table)
DT <- as.data.table(df)
DT[,which(unlist(lapply(DT, function(x)!all(is.na(x))))),with=F]
big_data <- replicate(10, data.frame(rep(NA, 1e6), sample(c(1:8,NA),1e6,T), sample(250,1e6,T)),simplify=F)
bd <- do.call(data.frame,big_data)
names(bd) <- paste0('X',seq_len(30))
DT <- as.data.table(bd)
system.time({df1 <- bd[,colSums(is.na(bd) < nrow(bd))]})
# error -- can't allocate vector of size ...
system.time({df2 <- bd[, !apply(is.na(bd), 2, all)]})
# error -- can't allocate vector of size ...
system.time({df3 <- Filter(function(x)!all(is.na(x)), bd)})
## user system elapsed
## 0.26 0.03 0.29
system.time({DT1 <- DT[,which(unlist(lapply(DT, function(x)!all(is.na(x))))),with=F]})
## user system elapsed
## 0.14 0.03 0.18
data.frame
যদিও আপনি একই সঙ্গে করতে পারে । এখানে আসলে কিছুই প্রয়োজন নেই data.table
। মূলটি হ'ল lapply
, যা দ্বারা করা সম্পূর্ণ সামগ্রীর অনুলিপি এড়িয়ে চলে is.na(df)
। এটি নির্দেশ করার জন্য +10।
bd1 <- bd[, unlist(lapply(bd, function(x), !all(is.na(x))))]
,
পরে অপসারণ করা দরকার function(x)
- বিটিডব্লিউ উদাহরণের জন্য ধন্যবাদ
dplyr
এখন এখানে একটি select_if
ক্রিয়া রয়েছে যা এখানে সহায়ক হতে পারে:
library(dplyr)
temp <- data.frame(x = 1:5, y = c(1,2,NA,4, 5), z = rep(NA, 5))
not_all_na <- function(x) any(!is.na(x))
not_any_na <- function(x) all(!is.na(x))
> temp
x y z
1 1 1 NA
2 2 2 NA
3 3 NA NA
4 4 4 NA
5 5 5 NA
> temp %>% select_if(not_all_na)
x y
1 1 1
2 2 2
3 3 NA
4 4 4
5 5 5
> temp %>% select_if(not_any_na)
x
1 1
2 2
3 3
4 4
5 5
dplyr
সমাধান খুঁজছেন এখানে এসেছেন । হতাশ ছিল না। ধন্যবাদ!
অন্য উপায় হ'ল apply()
ফাংশনটি ব্যবহার করা ।
আপনার যদি ডেটা.ফ্রেম থাকে
df <- data.frame (var1 = c(1:7,NA),
var2 = c(1,2,1,3,4,NA,NA,9),
var3 = c(NA)
)
তারপরে আপনি apply()
কোন কলামগুলি আপনার শর্ত পূরণ করে তা দেখতে ব্যবহার করতে পারেন এবং সুতরাং আপনি কেবলমাত্র একটি apply
পদ্ধতির সাহায্যে মুসার উত্তরের মতো একই সাবসেটিংটি করতে পারেন ।
> !apply (is.na(df), 2, all)
var1 var2 var3
TRUE TRUE FALSE
> df[, !apply(is.na(df), 2, all)]
var1 var2
1 1 1
2 2 2
3 3 1
4 4 3
5 5 4
6 6 NA
7 7 NA
8 NA 9
গৃহীত উত্তরটি সংখ্যাযুক্ত কলামগুলির সাথে কাজ করে না। এই উত্তর থেকে , নিম্নলিখিত বিভিন্ন ধরণের ডেটাযুক্ত কলামগুলির সাথে কাজ করে
Filter(function(x) !all(is.na(x)), df)
আমি আশা করি এটিও সাহায্য করতে পারে। এটি একটি একক কমান্ডে তৈরি করা যেতে পারে তবে এটি দুটি কমান্ডে ভাগ করে আমার পড়া সহজ হয়েছে। আমি নিম্নলিখিত নির্দেশাবলী সঙ্গে একটি ফাংশন তৈরি এবং দ্রুত বাজ কাজ।
naColsRemoval = function (DataTable) {
na.cols = DataTable [ , .( which ( apply ( is.na ( .SD ) , 2 , all ) ) )]
DataTable [ , unlist (na.cols) := NULL , with = F]
}
.এসডি আপনার ইচ্ছামত, টেবিলের অংশে যাচাইকরণ সীমাবদ্ধ করার অনুমতি দেবে, তবে এটি পুরো টেবিলটিকে গ্রহণ করবে
আপনি জ্যানিটর প্যাকেজটি ব্যবহার করতে পারেন remove_empty
library(janitor)
df %>%
remove_empty(c("rows", "cols")) #select either row or cols or both
এছাড়াও, আরেকটি dplyr পদ্ধতির
library(dplyr)
df %>% select_if(~all(!is.na(.)))
অথবা
df %>% select_if(colSums(!is.na(.)) == nrow(df))
যদি আপনি কেবলমাত্র অনুপস্থিত মানের উদাহরণ সহ কলামটি বাদ / রাখতে চান তবে এটিও কার্যকর
df %>% select_if(colSums(!is.na(.))>500)