空無

空無 在 R

1 個練習

關於 空無

許多語言都有像 null 或 none 這樣的方式,用來表示不存在的值。由於 R 是為了處理大量(而且往往雜亂的)資料而設計的,因此它有多種表示「空無」的形式。

整體目標是:在遇到缺失或可疑的值時把它標記出來,然後繼續執行,而不引發例外。

NULL

如果某個值真的不存在,就會用 NULL 來表示。這大概最接近 C 或 Python 的做法。

v <- c() # zero-length vector
v
#> NULL
is.null(v)
#> [1] TRUE

在許多情況下,NULL 值會直接被忽略:

c(2, 3, NULL, 5)
#> [1] 2 3 5

NA

對於值確實存在、但我們不知道它是什麼的情況,就會使用 NA。舉例來說,在計算道路上的車輛時,人工觀測員可能請病假,或是自動感測器故障,但車流依然持續。

v <- c(1, 2, NA, 4, 5)
v
#> [1]  1  2 NA 4  5
is.na(v) # test for data gaps
#> [1] FALSE FALSE  TRUE FALSE FALSE

因此 NA 是一種佔位符,提醒人類需要決定該如何處理它。

如果資料中含有 NA 值,統計函式通常預設會回傳 NA。如果你想忽略這些值,可以用 na.rm(NA remove)參數明確表示:

v <- c(1, 2, NA, 4, 5)
mean(v)
#> [1] NA
mean(v, na.rm = TRUE)
#> [1] 3

NaN

NaN 是「Not a Number」的縮寫,用來標記在預期會得到數字的情況下所發生的計算問題。

n <- c(0, 2, 4)
d <- c(0, 1, 2)
n / d
#> [1] NaN   2   2  # 0/0 is mathematically undefined
is.nan(n / d)
#> [1]  TRUE FALSE FALSE

這並不是「無效」計算的唯一可能結果。當分子不為零時,除以零會回傳 Inf 或 -Inf,而且不會引發錯誤。

1 / 0
#> [1] Inf

空向量

或許令人意外的是,R 並沒有標準的方法可以檢查向量是否為空,不過有些第三方套件會實作自己的函式,例如 is.empty()。

就連產生一個空向量也不是那麼顯而易見。我們在前面的章節看過,不帶引數的 c() 會回傳 NULL,而不是向量。

is.vector(c())
#> [1] FALSE

像 logical() 或 integer() 這類函式會接受一個指定所需長度的引數,這個長度可以是零。

z <- logical(0)
is.vector(z)
#> [1] TRUE
length(z)
#> [1] 0

我們也可以先產生一個向量,再移除其中每個元素,如向量概念所述。這樣會得到一個長度為 0、型別適當的向量。

v <- 5
v[-1]  # delete the first element
#> numeric(0)
透過 GitHub 編輯 連結會在新視窗或分頁中開啟

學習 空無