Leg ggplot2-waarschuwing uit: “K rijen verwijderd met ontbrekende waarden”

Ik krijg deze waarschuwing wanneer ik een plot probeer te genereren met ggplot.

Na een tijdje online onderzoek te hebben gedaan, suggereerden velen dat mijn database null-waarden bevat of ontbrekende gegevens in het algemeen, wat niet het geval was.

In deze vraag het geaccepteerde antwoord zegt het volgende:

De waarschuwing betekent dat sommige elementen zijn verwijderd omdat ze buiten het opgegeven bereik vallen

Ik vroeg me af waar dit bereik precies naar verwijst en hoe iemand dit bereik handmatig kan vergroten om alle waarschuwingen te vermijden?


Antwoord 1, autoriteit 100%

Het gedrag dat u ziet, is te wijten aan de manier waarop ggplot2omgaat met gegevens die buiten het asbereik van de plot vallen. U kunt dit gedrag wijzigen afhankelijk van of u scale_y_continuous(of, equivalent, ylim) of coord_cartesiangebruikt om asbereiken in te stellen, zoals hieronder wordt uitgelegd.

library(ggplot2)
# All points are visible in the plot
ggplot(mtcars, aes(mpg, hp)) + 
  geom_point()

In de onderstaande code ligt één punt met hp = 335 buiten het y-bereik van de plot. Omdat we scale_y_continuoushebben gebruikt om het bereik van de y-as in te stellen, wordt dit punt ook niet opgenomen in andere statistieken of samenvattende metingen die zijn berekend door ggplot, zoals de lineaire regressielijn.

ggplot(mtcars, aes(mpg, hp)) + 
  geom_point() +
  scale_y_continuous(limits=c(0,300)) +  # Change this to limits=c(0,335) and the warning disappars
  geom_smooth(method="lm")
Warning messages:
1: Removed 1 rows containing missing values (stat_smooth). 
2: Removed 1 rows containing missing values (geom_point).

In de onderstaande code ligt het punt met hp = 335 nog steeds buiten het y-bereik van de grafiek, maar dit punt is niettemin opgenomen in alle statistieken of samenvattende maatregelen die ggplot berekent, zoals de lineaire regressielijn. Dit komt omdat we coord_cartesianhebben gebruikt om het bereik van de y-as in te stellen, en deze functie sluit geen punten uit die buiten het plotbereik liggen wanneer het andere berekeningen op de gegevens uitvoert.

Als je deze en de vorige grafiek vergelijkt, kun je zien dat de lineaire regressielijn in de tweede grafiek een iets steilere helling heeft, omdat het punt met hp=335 wordt meegenomen bij het berekenen van de regressielijn, ook al is het niet zichtbaar in het complot.

ggplot(mtcars, aes(mpg, hp)) + 
  geom_point() +
  coord_cartesian(ylim=c(0,300)) +
  geom_smooth(method="lm")

Antwoord 2, autoriteit 17%

Alleen voor de schok van het invullen van het antwoord van eipi10.

Ik had hetzelfde probleem, zonder scale_y_continuousof coord_cartesiante gebruiken.

Het conflict kwam van de x-as, waar ik limits = c(1, 30)definieerde. Het lijkt erop dat dergelijke limieten niet genoeg ruimte bieden als je je balken wilt “ontwijken”, dus R geeft nog steeds de fout

8 rijen verwijderd met ontbrekende waarden (geom_bar)

Het aanpassen van de limieten van de x-as naar limits = c(0, 31)loste het probleem op.

Tot slot, zelfs als u geen grenzen stelt aan uw y-as, moet u het gedrag van uw x-as controleren om er zeker van te zijn dat u voldoende ruimte heeft


Antwoord 3

Zelfs als uw gegevens binnen uw gespecificeerde limieten vallen (bijv. c(0, 335)), kan het toevoegen van een geom_jitter()-instructie sommige punten buiten die limieten duwen, met dezelfde foutmelding.

library(ggplot2)
range(mtcars$hp)
#> [1]  52 335
# No jitter -- no error message
ggplot(mtcars, aes(mpg, hp)) + 
    geom_point() +
    scale_y_continuous(limits=c(0,335))
# Jitter is too large -- this generates the error message
ggplot(mtcars, aes(mpg, hp)) + 
    geom_point() +
    geom_jitter(position = position_jitter(w = 0.2, h = 0.2)) +
    scale_y_continuous(limits=c(0,335))
#> Warning: Removed 1 rows containing missing values (geom_point).

Gemaakt op 24-08-2020 door het reprex-pakket(v0.3.0)


Antwoord 4

Ik kwam dit ook tegen, maar in het geval dat ik de extra foutmeldingen wilde vermijden terwijl ik het geboden bereik wilde behouden. Een optie is ook om de gegevens te subsetten voordat het bereik wordt ingesteld, zodat het bereik kan worden gehouden zoals je wilt zonder waarschuwingen te activeren.

library(ggplot2)
range(mtcars$hp)
#> [1]  52 335
# Setting limits with scale_y_continous (or ylim) and subsetting accordingly
## avoid warning messages about removing data
ggplot(data= subset(mtcars, hp<=300 & hp >= 100), aes(mpg, hp)) + 
  geom_point() +
  scale_y_continuous(limits=c(100,300))

Antwoord 5

Een andere reden daarvoor is het bestaan ​​van NA’s. Stel dat uw arraynaam arris. U kunt eenvoudig controleren of u NA’s in uw array heeft door:

any(is.na(arr))

Als het antwoord WAAR was, dan moet je NA’s verwijderen zoals hieronder:

arr = arr[-which(is.na(arr)]

Zelfs zonder any(is.na(arr)), kun je gewoon het bovenstaande commando uitvoeren en R zal alle mogelijke NA’s verwijderen.

Other episodes