Pregunta Eliminar filas con todas o algunas NA (valores faltantes) en data.frame
Me gustaría eliminar las líneas en este marco de datos que ...
un) Contiene NA
s en todas las columnas. A continuación está mi marco de datos de ejemplo.
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
Básicamente, me gustaría obtener un marco de datos como el siguiente.
gene hsap mmul mmus rnor cfam
2 ENSG00000199674 0 2 2 2 2
6 ENSG00000221312 0 1 2 3 2
segundo) Contiene NA
s solo en algunas columnas, así que también puedo obtener este resultado:
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
651
2018-02-01 11:52
origen
Respuestas:
También verifica complete.cases
:
> final[complete.cases(final), ]
gene hsap mmul mmus rnor cfam
2 ENSG00000199674 0 2 2 2 2
6 ENSG00000221312 0 1 2 3 2
na.omit
es más agradable para simplemente eliminar todo NA
es complete.cases
permite la selección parcial al incluir solo ciertas columnas del marco de datos:
> final[complete.cases(final[ , 5:6]),]
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
Tu solución no puede funcionar Si insistes en usar is.na
, entonces tienes que hacer algo como:
> final[rowSums(is.na(final[ , 5:6])) == 0, ]
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
pero usando complete.cases
es mucho más claro y más rápido.
830
2018-02-01 12:21
Tratar na.omit(your.data.frame)
. En cuanto a la segunda pregunta, intente publicarla como otra pregunta (para mayor claridad).
200
2018-02-01 12:00
Prefiero seguir la forma de verificar si las filas contienen alguna NA:
row.has.na <- apply(final, 1, function(x){any(is.na(x))})
Esto devuelve un vector lógico con valores que indican si hay alguna NA en una fila. Puedes usarlo para ver cuántas filas tendrás que soltar:
sum(row.has.na)
y eventualmente dejarlos caer
final.filtered <- final[!row.has.na,]
Para filtrar filas con cierta parte de NA, se vuelve un poco más complicado (por ejemplo, puede enviar 'final [, 5: 6]' a 'aplicar').
En general, la solución de Joris Meys parece ser más elegante.
78
2018-02-02 21:58
Si te gustan las tuberías (%>%
), tidyr
es nuevo drop_na
es tu amigo:
library(tidyr)
df %>% drop_na()
# gene hsap mmul mmus rnor cfam
# 2 ENSG00000199674 0 2 2 2 2
# 6 ENSG00000221312 0 1 2 3 2
df %>% drop_na(rnor, cfam)
# 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
52
2017-08-16 08:49
Otra opción si desea un mayor control sobre cómo se considera que las filas son inválidas es
final <- final[!(is.na(final$rnor)) | !(is.na(rawdata$cfam)),]
Usando lo anterior, esto:
gene hsap mmul mmus rnor cfam
1 ENSG00000208234 0 NA NA NA 2
2 ENSG00000199674 0 2 2 2 2
3 ENSG00000221622 0 NA NA 2 NA
4 ENSG00000207604 0 NA NA 1 2
5 ENSG00000207431 0 NA NA NA NA
6 ENSG00000221312 0 1 2 3 2
Se convierte en:
gene hsap mmul mmus rnor cfam
1 ENSG00000208234 0 NA NA NA 2
2 ENSG00000199674 0 2 2 2 2
3 ENSG00000221622 0 NA NA 2 NA
4 ENSG00000207604 0 NA NA 1 2
6 ENSG00000221312 0 1 2 3 2
... donde solo se elimina la fila 5 ya que es la única fila que contiene NA para ambos rnor
Y cfam
. La lógica booleana se puede cambiar para ajustarse a requisitos específicos.
36
2017-11-05 06:30
Si desea controlar cuántas NA son válidas para cada fila, pruebe esta función. Para muchos conjuntos de datos de encuestas, demasiadas respuestas a preguntas en blanco pueden arruinar los resultados. Entonces se eliminan después de un cierto umbral. Esta función le permitirá elegir cuántas NA puede tener la fila antes de ser eliminada:
delete.na <- function(DF, n=0) {
DF[rowSums(is.na(DF)) <= n,]
}
Por defecto, eliminará todas las NA:
delete.na(final)
gene hsap mmul mmus rnor cfam
2 ENSG00000199674 0 2 2 2 2
6 ENSG00000221312 0 1 2 3 2
O especifique la cantidad máxima de NA permitidas:
delete.na(final, 2)
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
29
2018-05-26 14:49
Esto devolverá las filas que tienen al menos UN valor no NA.
final[rowSums(is.na(final))<length(final),]
Esto devolverá las filas que tienen al menos DOS valores no NA.
final[rowSums(is.na(final))<(length(final)-1),]
14
2017-09-19 12:36
También podemos usar la función de subconjunto para esto.
finalData<-subset(data,!(is.na(data["mmul"]) | is.na(data["rnor"])))
Esto dará solo aquellas filas que no tienen NA tanto en mmul como en rnor
12
2017-11-11 22:15
Usando el paquete dplyr podemos filtrar NA de la siguiente manera:
dplyr::filter(df, !is.na(columnname))
12
2018-04-12 05:44