R Language
Värden saknas
Sök…
Introduktion
När vi inte vet vilket värde en variabel tar, säger vi att dess värde saknas, indikerat av NA
.
Anmärkningar
Värden som saknas representeras av symbolen NA
(ej tillgängligt). Omöjliga värden (t.ex. som ett resultat av sqrt(-1)
) representeras av symbolen NaN
(inte ett tal).
Undersöker saknade data
anyNA
rapporterar om det finns några saknade värden; medan is.na
rapporterar saknade värden elementärt:
vec <- c(1, 2, 3, NA, 5)
anyNA(vec)
# [1] TRUE
is.na(vec)
# [1] FALSE FALSE FALSE TRUE FALSE
ìs.na
returnerar en logisk vektor som tvingas till heltalsvärden under aritmetiska operationer (med FALSE = 0, TRUE = 1). Vi kan använda detta för att ta reda på hur många saknade värden det finns:
sum(is.na(vec))
# [1] 1
Genom att utvidga detta tillvägagångssätt kan vi använda colSums
och is.na
på en dataram för att räkna NA: er per kolumn:
colSums(is.na(airquality))
# Ozone Solar.R Wind Temp Month Day
# 37 7 0 0 0 0
Paketet naniar (för närvarande på github men inte CRAN) erbjuder ytterligare verktyg för att utforska saknade värden.
Läsa och skriva data med NA-värden
När du läser tabelluppsättningar med funktionerna read.*
Söker R automatiskt efter saknade värden som ser ut som "NA"
. Saknade värden representeras emellertid inte alltid av NA
. Ibland indikerar en punkt ( .
), En bindestreck ( -
) eller ett teckenvärde (t.ex. empty
) att ett värde är NA
. na.strings
parametern för funktionen read.*
Kan användas för att berätta R vilka symboler / tecken som måste behandlas som NA
värden:
read.csv("name_of_csv_file.csv", na.strings = "-")
Det är också möjligt att indikera att mer än en symbol måste läsas som NA
:
read.csv('missing.csv', na.strings = c('.','-'))
På liknande sätt kan NA
skrivas med anpassade strängar med na
argumentet för att write.csv
. Andra verktyg för att läsa och skriva tabeller har liknande alternativ.
Använda NA: er från olika klasser
Symbolen NA
är för ett logical
saknat värde:
class(NA)
#[1] "logical"
Detta är bekvämt eftersom det lätt kan tvingas till andra atomiska vektortyper och därför vanligtvis är det enda NA
du behöver:
x <- c(1, NA, 1)
class(x[2])
#[1] "numeric"
Om du behöver ett enda NA
värde av en annan typ, använd NA_character_
, NA_integer_
, NA_real_
eller NA_complex_
. För saknade värden på fancy klasser fungerar vanligtvis inställning med NA_integer_
; till exempel för att få ett saknat värde Datum:
class(Sys.Date()[NA_integer_])
# [1] "Date"
TRUE / FALSE och / eller NA
NA
är en logisk typ och en logisk operatör med en NA
kommer att returnera NA
om resultatet är tvetydigt. Nedan utvärderar NA OR TRUE
till TRUE
eftersom åtminstone en sida utvärderar till TRUE
, men NA OR FALSE
returnerar NA
eftersom vi inte vet om NA
skulle ha varit TRUE
eller FALSE
NA | TRUE
# [1] TRUE
# TRUE | TRUE is TRUE and FALSE | TRUE is also TRUE.
NA | FALSE
# [1] NA
# TRUE | FALSE is TRUE but FALSE | FALSE is FALSE.
NA & TRUE
# [1] NA
# TRUE & TRUE is TRUE but FALSE & TRUE is FALSE.
NA & FALSE
# [1] FALSE
# TRUE & FALSE is FALSE and FALSE & FALSE is also FALSE.
Dessa egenskaper är användbara om du vill deluppsätta en datauppsättning baserad på vissa kolumner som innehåller NA
.
df <- data.frame(v1=0:9,
v2=c(rep(1:2, each=4), NA, NA),
v3=c(NA, letters[2:10]))
df[df$v2 == 1 & !is.na(df$v2), ]
# v1 v2 v3
#1 0 1 <NA>
#2 1 1 b
#3 2 1 c
#4 3 1 d
df[df$v2 == 1, ]
v1 v2 v3
#1 0 1 <NA>
#2 1 1 b
#3 2 1 c
#4 3 1 d
#NA NA NA <NA>
#NA.1 NA NA <NA>
Utelämnar eller ersätter saknade värden
Omkodning av saknade värden
Vanligtvis är saknade data inte kodade som NA
i datasätt. I SPSS till exempel representeras ofta saknade värden av värdet 99
.
num.vec <- c(1, 2, 3, 99, 5)
num.vec
## [1] 1 2 3 99 5
Det är möjligt att direkt tilldela NA med underinställning
num.vec[num.vec == 99] <- NA
Emellertid är den föredragna metoden att använda is.na<-
som nedan. ?is.na
( ?is.na
) anger:
is.na<-
kan ge ett säkrare sätt att ställa in saknad. Det uppför sig till exempel olika faktorer.
is.na(num.vec) <- num.vec == 99
Båda metoderna återgår
num.vec
## [1] 1 2 3 NA 5
Tar bort saknade värden
Värden som saknas kan tas bort på flera sätt från en vektor:
num.vec[!is.na(num.vec)]
num.vec[complete.cases(num.vec)]
na.omit(num.vec)
## [1] 1 2 3 5
Exklusive saknade värden från beräkningar
När du använder aritmetiska funktioner på vektorer med saknade värden kommer ett saknat värde att returneras:
mean(num.vec) # returns: [1] NA
Parameteren na.rm
berättar för funktionen att utesluta NA
värden från beräkningen:
mean(num.vec, na.rm = TRUE) # returns: [1] 2.75
# an alternative to using 'na.rm = TRUE':
mean(num.vec[!is.na(num.vec)]) # returns: [1] 2.75
Vissa R-funktioner, som lm
, har en na.action
parameter. Standardvärdet för detta är na.omit
, men med options(na.action = 'na.exclude')
kan standardbeteendet för R ändras.
Om det inte är nödvändigt att ändra standardbeteendet, men för en specifik situation na.action
annan na.action
na.action
parametern na.action
inkluderas i funktionssamtalet, t.ex.
lm(y2 ~ y1, data = anscombe, na.action = 'na.exclude')