1061 Stimmen

Zeilen mit allen oder einigen NAs (fehlenden Werten) im data.frame entfernen

Ich würde gerne die Zeilen in diesem Datenrahmen entfernen, die:

a) enthalten NA s über alle Spalten hinweg. Nachfolgend finden Sie ein Beispiel für einen Datenrahmen.

             gene hsap mmul mmus rnor cfam
1 ENSG00000208234    0   NA   NA   NA   NA
2 ENSG00000199674    0   2    2    2    2
3 ENSG00000221622    0   NA   NA   NA   NA
4 ENSG00000207604    0   NA   NA   1    2
5 ENSG00000207431    0   NA   NA   NA   NA
6 ENSG00000221312    0   1    2    3    2

Im Grunde möchte ich einen Datenrahmen wie den folgenden erhalten.

             gene hsap mmul mmus rnor cfam
2 ENSG00000199674    0   2    2    2    2
6 ENSG00000221312    0   1    2    3    2

b) enthalten NA s nur in einigen Spalten so kann ich auch dieses Ergebnis erhalten:

             gene hsap mmul mmus rnor cfam
2 ENSG00000199674    0   2    2    2    2
4 ENSG00000207604    0   NA   NA   1    2
6 ENSG00000221312    0   1    2    3    2

19voto

Leo Punkte 1727

Dies gibt die Zeilen zurück, die mindestens EINEN Nicht-NA-Wert haben.

final[rowSums(is.na(final))<length(final),]

Dies gibt die Zeilen zurück, die mindestens ZWEI Nicht-NA-Werte haben.

final[rowSums(is.na(final))<(length(final)-1),]

14voto

Ramya Ural Punkte 141

Wir können dafür auch die Untermengenfunktion verwenden.

finalData<-subset(data,!(is.na(data["mmul"]) | is.na(data["rnor"])))

Dies ergibt nur die Zeilen, die nicht sowohl in mmul als auch in rnor NA enthalten

10voto

Prradep Punkte 5017

Angenommen, dat als Ihren Datenrahmen zu verwenden, kann die erwartete Ausgabe mit

1. rowSums

> dat[!rowSums((is.na(dat))),]
             gene hsap mmul mmus rnor cfam
2 ENSG00000199674    0   2    2    2    2
6 ENSG00000221312    0   1    2    3    2

2. lapply

> dat[!Reduce('|',lapply(dat,is.na)),]
             gene hsap mmul mmus rnor cfam
2 ENSG00000199674    0   2    2    2    2
6 ENSG00000221312    0   1    2    3    2

10voto

kasia_b Punkte 116

dplyr Mit Version 1.0.4 wurden zwei zusätzliche Funktionen eingeführt, die filter : Sie sind if_any() y if_all() . El if_all() Die Funktion des Begleiters ist in diesem Fall besonders nützlich:

a) So entfernen Sie Zeilen, die in allen Spalten NAs enthalten

df %>% 
  filter(if_all(everything(), ~ !is.na(.x)))

In dieser Zeile werden nur die Zeilen beibehalten, in denen keine der Spalten ein NA enthält.

b) Um Zeilen zu entfernen, die nur in einigen Spalten NAs enthalten

cols_to_check = c("rnor", "cfam")

df %>% 
  filter(if_all(cols_to_check, ~ !is.na(.x)))

Diese Zeile prüft, ob eine der angegebenen Spalten (cols_to_check) NAs enthält, und behält nur die Zeilen bei, bei denen dies nicht der Fall ist.

9voto

Jerry T Punkte 1336

Ich bin ein Synthesizer:). Hier habe ich die Antworten in einer Funktion zusammengefasst:

#' keep rows that have a certain number (range) of NAs anywhere/somewhere and delete others
#' @param df a data frame
#' @param col restrict to the columns where you would like to search for NA; eg, 3, c(3), 2:5, "place", c("place","age")
#' \cr default is NULL, search for all columns
#' @param n integer or vector, 0, c(3,5), number/range of NAs allowed.
#' \cr If a number, the exact number of NAs kept
#' \cr Range includes both ends 3<=n<=5
#' \cr Range could be -Inf, Inf
#' @return returns a new df with rows that have NA(s) removed
#' @export
ez.na.keep = function(df, col=NULL, n=0){
    if (!is.null(col)) {
        # R converts a single row/col to a vector if the parameter col has only one col
        # see https://radfordneal.wordpress.com/2008/08/20/design-flaws-in-r-2-%E2%80%94-dropped-dimensions/#comments
        df.temp = df[,col,drop=FALSE]
    } else {
        df.temp = df
    }

    if (length(n)==1){
        if (n==0) {
            # simply call complete.cases which might be faster
            result = df[complete.cases(df.temp),]
        } else {
            # credit: http://stackoverflow.com/a/30461945/2292993
            log <- apply(df.temp, 2, is.na)
            logindex <- apply(log, 1, function(x) sum(x) == n)
            result = df[logindex, ]
        }
    }

    if (length(n)==2){
        min = n[1]; max = n[2]
        log <- apply(df.temp, 2, is.na)
        logindex <- apply(log, 1, function(x) {sum(x) >= min && sum(x) <= max})
        result = df[logindex, ]
    }

    return(result)
}

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X