Soy usuario de python aprendiendo R.
Con frecuencia, necesito comprobar si las columnas de un marco de datos contienen NaN(s).
En python, simplemente puedo hacer
import pandas as pd df = pd.DataFrame({'colA': [1, 2, None, 3], 'colB': ['A', 'B', 'C', 'D']}) df.isna().any()dando me
colA True colB False dtype: boolEn R estoy luchando por encontrar una solución fácil. La gente se refiere a algunos métodos de aplicación, pero eso parece demasiado complejo para una tarea tan primitiva. La solución más cercana que he encontrado es esta:
library(tidyverse) df = data.frame(colA = c(1, 2, NA, 3), colB = c('A', 'B', 'C', 'D')) !complete.cases(t(df))donación
[1] TRUE FALSEEstá bien, pero no veo los nombres de las columnas. Si el marco de datos tiene 50 columnas, no sé cuál tiene NaN.
¿Hay una mejor solución R?
Puedes usar anyNA: Verifica NA en un vector
df = data.frame(colA = c(1, 2, NA, 3), colB = c('A', 'B', 'C', 'D')) sapply(df, anyNA) colA colB TRUE FALSEjay.sf tiene razón. Esto comprobará si hay NaN.
df = data.frame(colA = c(1, 2, NA, 3), colB = c('A', 'B', 'C', 'D')) anyNAN <- function(x) { any(is.nan(x)) } sapply(df, anyNAN)La mejor manera de verificar si las columnas tienen NA es aplicar un ciclo a las columnas con una función para verificar si hay any(is.na) .
lapply(df, function(x) any(is.na(x))) $colA [1] TRUE $colB [1] FALSEPuedo ver que cargaste el tidyverse pero no lo usaste en tu ejemplo. Si queremos hacer esto dentro del tidyverse, podemos usar purrr:
library(purrr) df %>% map(~any(is.na(.x)))O con dplyr:
library(dplyr) df %>% summarise(across(everything(), ~any(is.na(.x)) colA colB 1 TRUE FALSELa forma más fácil sería:
df = data.frame(colA = c(1, 2, NA, 3), colB = c('A', 'B', 'C', 'D')) is.na(df)Producción:
colA colB [1,] FALSE FALSE [2,] FALSE FALSE [3,] TRUE FALSE [4,] FALSE FALSEActualice , si solo desea ver las filas que contienen NA:
> df[rowSums(is.na(df)) > 0,] colA colB 3 NA C Update2 , o para obtener solo ColNames con información sobre NA (gracias a RSale for anyNA ):
> lapply(df, anyNA) $colA [1] TRUE $colB [1] FALSE