मेरे पास सभी NA मानों के साथ कुछ कॉलम वाले डेटा.फ्रेम हैं, मैं उन्हें डेटा से कैसे हटा सकता हूं।
क्या मैं फ़ंक्शन का उपयोग कर सकता हूं
na.omit(...)
कुछ अतिरिक्त तर्क निर्दिष्ट कर रहे हैं?
मेरे पास सभी NA मानों के साथ कुछ कॉलम वाले डेटा.फ्रेम हैं, मैं उन्हें डेटा से कैसे हटा सकता हूं।
क्या मैं फ़ंक्शन का उपयोग कर सकता हूं
na.omit(...)
कुछ अतिरिक्त तर्क निर्दिष्ट कर रहे हैं?
head(data)
? क्या आप संबंधित कॉलम या पंक्तियों को हटाना चाहते हैं?
जवाबों:
इसे करने का एक तरीका:
df[, colSums(is.na(df)) != nrow(df)]
यदि किसी कॉलम में NA की संख्या पंक्तियों की संख्या के बराबर है, तो यह पूरी तरह से NA होना चाहिए।
या इसी तरह
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)
janitor::remove_empty_cols()
पदावनत किया जाता है - उपयोग करेंdf <- janitor::remove_empty(df, which = "cols")
यह देखता है कि आप ऑल एस के साथ केवल कॉलम को हटाना चाहते हैं , जो कुछ पंक्तियों के साथ कॉलम छोड़ रहे हैं । मैं यह करूँगा (लेकिन मुझे यकीन है कि एक कुशल सदिश सेना है: 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)
हालांकि मैं सिर्फ इसलिए करूंगा क्योंकि यह थोड़ा नटखट है और एक समय में एक पंक्ति 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
क्योंकि प्रदर्शन वास्तव में मेरे लिए महत्वपूर्ण था, मैंने उपरोक्त सभी कार्यों को बेंचमार्क किया।
नोट: @Simon O'Hanlon के पोस्ट से डेटा। केवल 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")