2016-07-21 10 views
1

Ich habe einen Datensatz mit 160 Spalten. Einige dieser Spalten enthalten viel NA und # DIV/0! ich die Daten auf folgende Weise laden:R - Reinigung Datensatzspalten für NA, NaN, DIV/0

training = read.csv("training.csv",header = TRUE,na.strings = c("NA","NaN","","#DIV/0!"))

Wie kann ich nur Spalten halten, dass die Werte in allen Zeilen enthält?

+2

Bitte fügen Sie, was Sie – ganesshkumar

Antwort

0

@ SRivero Antwort funktioniert, hier ist eine andere

set.seed(1234) 
dat <- as.data.frame(matrix(runif(100000),1000,10)) 
dat[sample(1:100,20,replace=TRUE),sample(1:10,3,replace=TRUE)] <- NA 

# apply through each column seeing if any are NAs 
dat[,sapply(dat,function(x) !any(is.na(x)))] 

# Check if both answers give same result 
all.equal(dat[,which(sapply(dat,function(x) !any(is.na(x))))], 
dat[ , colSums(is.na(dat)) == 0]) 
[1] TRUE 

Obwohl mein ein bisschen schneller

library(microbenchmark) 

microbenchmark(dat[,sapply(dat,function(x) !any(is.na(x)))], 
dat[ , colSums(is.na(dat)) == 0]) 
Unit: microseconds 
              expr  min  lq  mean median  uq  max neval 
dat[, sapply(dat, function(x) !any(is.na(x)))] 87.464 89.7790 94.51491 90.9830 97.124 190.865 100 
       dat[, colSums(is.na(dat)) == 0] 197.958 199.9585 226.49657 201.4265 207.278 1382.612 100 
0

Vielleicht:

training[ , colSums(is.na(training)) == 0] 
+0

versucht haben bisher sollte dies tun, was Sie wollen. Wenn zeigen, ist der Datensatz vielleicht einfacher zu helfen. –

+0

Ja beide funktionieren, meins ist kürzer. –

0

Eine weitere Option select_if() von dplyr Verwendung ist. Sie können ein Prädikat für die Spalten eines Datenrahmens verwenden. Nur die Spalten, für die das Prädikat TRUE kehrt werden ausgewählt:

library(dplyr) 
select_if(dat, function(x) !any(is.na(x))