[英]Difference between NA_real_ and NaN
當我使用.Internal(inspect())
到NA_real_
和NaN
時,它返回,
> .Internal(inspect(NA_real_))
@0x000001e79724d0e0 14 REALSXP g0c1 [REF(2)] (len=1, tl=0) nan
> .Internal(inspect(NaN))
@0x000001e797264a88 14 REALSXP g0c1 [REF(2)] (len=1, tl=0) nan
似乎他們唯一的區別是 memory 地址。
但是,當我將NA_real_
和NaN
強制轉換為字符時,它會返回,
> as.character(c(NaN, NA_real_))
[1] "NaN" NA
我知道它應該返回上述結果,因為NaN
不能是字符,它將被強制轉換為"NaN"
但NA_real
將被強制轉換為NA_character_
。 但是考慮到他們的直覺是一樣的,R 怎么能為他們返回不同的結果呢?
提前感謝您的任何建議!
出色地。 首先,請記住NA
是一個 R 概念,在 C 中沒有等價物。 因此,根據需要, NA
需要在 C 中以不同方式表示。 .Internal(inspect())
沒有做出這種區分的事實並不意味着它不是在其他地方做出的。 事實上,恰好.Internal(inspect())
使用Rprintf
打印值的內部雙浮點表示。 而且,實際上,R NA 在 C 類型中被編碼為 C 浮點類型中的 NaN 值。
其次,您觀察到“它們唯一的區別是 memory 地址。” - 所以呢? 至少在概念上,不同的 memory 地址完全足以區分 NA 和 NaN,不需要更多。
但事實上 R 通過不同的途徑區分這些值。 這是可能的,因為IEEE 754 雙精度浮點格式具有多種不同的 NaN 表示,並且 R 為 NA 保留了一個特定的表示:
static double R_ValueOfNA(void)
{
/* The gcc shipping with Fedora 9 gets this wrong without
* the volatile declaration. Thanks to Marc Schwartz. */
volatile ieee_double x;
x.word[hw] = 0x7ff00000;
x.word[lw] = 1954;
return x.value;
}
和:
/* is a value known to be a NaN also an R NA? */
int attribute_hidden R_NaN_is_R_NA(double x)
{
ieee_double y;
y.value = x;
return (y.word[lw] == 1954);
}
int R_IsNA(double x)
{
return isnan(x) && R_NaN_is_R_NA(x);
}
int R_IsNaN(double x)
{
return isnan(x) && ! R_NaN_is_R_NA(x);
}
( src/main/arithmetic.c
)
NA
是一個統計或數據完整性概念:“缺失值”的概念。 例如,如果您的數據來自填寫 forms 的人,則錯誤條目或缺失條目將被視為NA
。
NaN
是一個數字或計算概念:“不是數字”的東西。 例如 0/0 是NAN
,因為這個計算的結果是未定義的(但請注意 1/0 是Inf
或無窮大,同樣 -1/0 是-Inf
)。
R 在內部處理這些概念的方式不是您應該關心的。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.