जवाबों:
इसे इस्तेमाल करे:
df <- df[,colSums(is.na(df))<nrow(df)]
इस प्रकार पेश किए गए दो दृष्टिकोण बड़े डेटा सेटों (अन्य मेमोरी मुद्दों के बीच) के साथ विफल होते हैं is.na(df)
, जो वे बनाते हैं , जो ऑब्जेक्ट के समान आकार होगा df
।
यहां दो दृष्टिकोण हैं जो अधिक मेमोरी और समय कुशल हैं
का उपयोग कर एक दृष्टिकोण Filter
Filter(function(x)!all(is.na(x)), df)
और data.table (सामान्य समय और मेमोरी दक्षता के लिए) का उपयोग कर एक दृष्टिकोण
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)
- उदाहरण के लिए धन्यवाद btw
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()
फ़ंक्शन का उपयोग करना।
यदि आपके पास data.frame है
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
मुझे उम्मीद है कि यह भी मदद कर सकता है। इसे एक ही कमांड में बनाया जा सकता है, लेकिन मुझे इसे दो कमांड में विभाजित करके पढ़ना आसान लगा। मैंने निम्नलिखित निर्देश के साथ एक समारोह बनाया और बिजली की तेजी से काम किया।
naColsRemoval = function (DataTable) {
na.cols = DataTable [ , .( which ( apply ( is.na ( .SD ) , 2 , all ) ) )]
DataTable [ , unlist (na.cols) := NULL , with = F]
}
.SD, यदि आप चाहें, तो सत्यापन को तालिका के भाग में सीमित करने की अनुमति देगा, लेकिन यह पूरी तालिका को ले जाएगा
आप Janitor पैकेज का उपयोग कर सकते हैं remove_empty
library(janitor)
df %>%
remove_empty(c("rows", "cols")) #select either row or cols or both
इसके अलावा, एक और साहसी दृष्टिकोण
library(dplyr)
df %>% select_if(~all(!is.na(.)))
या
df %>% select_if(colSums(!is.na(.)) == nrow(df))
यह भी उपयोगी है यदि आप कुछ निश्चित मानों के साथ कॉलम को केवल बाहर करना / रखना चाहते हैं जैसे
df %>% select_if(colSums(!is.na(.))>500)