Cómo eliminar filas de un dataframe que contiene n * NA

Tengo una serie de grandes conjuntos de datos con ~ 10 columnas y ~ 200000 filas. No todas las columnas contienen valores para cada fila, aunque al menos una columna debe contener un valor para que la fila esté presente, me gustaría establecer un umbral para cuántas NA están permitidas en una fila.

Mi Dataframe se parece a esto:

  ID qrstuvwxyz A 1 5 NA 3 8 9 NA 8 6 4 B 5 NA 4 6 1 9 7 4 9 3 C NA 9 4 NA 4 8 4 NA 5 NA D 2 2 6 8 4 NA 3 7 1 32 

Y me gustaría poder eliminar las filas que contienen más de 2 celdas que contienen NA para obtener

 ID qrstuvwxyz A 1 5 NA 3 8 9 NA 8 6 4 B 5 NA 4 6 1 9 7 4 9 3 D 2 2 6 8 4 NA 3 7 1 32 

complete.cases elimina todas las filas que contienen NA , y sé que se pueden eliminar las filas que contienen NA en ciertas columnas, pero ¿hay alguna manera de modificarlo para que no sea específico sobre qué columnas contienen NA , pero cuántas del total ¿hacer?

Alternativamente, este dataframe se genera combinando varios marcos de datos utilizando

  file1<-read.delim("~/file1.txt") file2<-read.delim(file=args[1]) file1<-merge(file1,file2,by="chr.pos",all=TRUE) 

Quizás la función de fusión podría ser alterada?

Gracias

Use rowSums . Para eliminar filas de un dataframe ( df ) que contiene precisamente n valores de NA :

 df <- df[rowSums(is.na(df)) != n, ] 

o para eliminar filas que contienen n o más valores de NA :

 df <- df[rowSums(is.na(df)) < n, ] 

en ambos casos, por supuesto, reemplazar n con el número que se requiere

Si el nombre de su data.frame es el siguiente, devolverá lo que está buscando:

 keep <- rowSums(is.na(dat)) < 2 dat <- dat[keep, ] 

Qué está haciendo esto:

 is.na(dat) # returns a matrix of T/F # note that when adding logicals # T == 1, and F == 0 rowSums(.) # quickly computes the total per row # since your task is to identify the # rows with a certain number of NA's rowSums(.) < 2 # for each row, determine if the sum # (which is the number of NAs) is less # than 2 or not. Returns T/F accordingly 

Usamos el resultado de esta última statement para identificar qué filas mantener. Tenga en cuenta que no es necesario almacenar realmente esta última lógica.

Si d es su dataframe, intente esto:

 d <- d[rowSums(is.na(d)) < 2,] 

Esto devolverá un conjunto de datos donde faltan como máximo dos valores por fila:

 dfrm[ apply(dfrm, 1, function(r) sum(is.na(x)) <= 2 ) , ] 
    Intereting Posts