1 In general

In R there are several type of special values such as NA, NaN and NULL. They are similar but at the same time different especially when directly tested. In general:

  • NA is a missing information
  • NaN means not a number and is the result of an not-defined math operation like \(\frac{0}{0}\).
  • NULL is the absence of any information

2 Type

In terms of data type, NA is logical, NaN is numeric type and NULL do not have a specific type. A particularity of NA is that can be also adapted to the type of vector where is located. In R we cannot have a vector of numbers and logical values:

is.logical(NA)
## [1] TRUE
is.logical(NaN)
## [1] FALSE
is.logical(NULL)
## [1] FALSE
vec <- c(1,2,3,4, TRUE, 5, FALSE)
vec # TRUE is 1 and FALSE is 0
## [1] 1 2 3 4 1 5 0

But we can have a numeric, character or logical vector with NA values and the NA is forced to the specific type:

# NA alone is logical but

vec <- c(1,2,3,4,NA,5,6)
class(vec)
## [1] "numeric"
for(i in vec) print(class(i))
## [1] "numeric"
## [1] "numeric"
## [1] "numeric"
## [1] "numeric"
## [1] "numeric"
## [1] "numeric"
## [1] "numeric"
# now NA is numeric

This is possible because there are several type of NA values that are not usually employed directly but are used from R depending on the vector:

is.character(NA_character_)
## [1] TRUE
is.numeric(NA_real_)
## [1] TRUE
is.integer(NA_integer_)
## [1] TRUE
# This

vec <- c(1,2,3,4,5,NA)
vec
## [1]  1  2  3  4  5 NA
# is the same as

vec <- c(1,2,3,4,5,NA_integer_)
vec
## [1]  1  2  3  4  5 NA

The NaN is a numeric type because is the result of undefined operations:

is.numeric(NaN)
## [1] TRUE
0/0
## [1] NaN
vec <- c(1,2,3,4,NaN)
vec
## [1]   1   2   3   4 NaN

The NULL value is surely the strangest because represents the absence of any value and the class is NULL itself meaning that is different from NA and NaN values.

x <- NULL
class(x) # the class is NULL
## [1] "NULL"

Compared to NA and NaN that are associate with some information (absence of value and undefined number), NULL values are somehow transparent and cannot be stored in vectors:

vec <- c(1,2,3,4,5, NA, 8, NaN, 11, NULL)
vec # the null value is not present
## [1]   1   2   3   4   5  NA   8 NaN  11

3 The problem with NA

As Hadley suggest1 the NA values infect all other computations. Practically many R functions such as mean() or sd() cannot return a value if there is a NA within the target vector.

x <- c(runif(10), NA)
mean(x)
## [1] NA
sd(x)
## [1] NA

In fact, these functions have a specific argument na.rm = TRUE for doing the computation without considering NA values. Of course we can remove NA values before the computation and the result will be the same:

mean(x, na.rm = TRUE)
## [1] 0.4320439
mean(x[!is.na(x)])
## [1] 0.4320439

  1. Sources

    ↩︎
LS0tCnRpdGxlOiAiRGVhbGluZyB3aXRoIE5BL05VTEwvTmFOIgpvdXRwdXQ6IAogICAgYm9va2Rvd246Omh0bWxfZG9jdW1lbnQyOgogICAgICAgIHRvYzogdHJ1ZQogICAgICAgIHRvY19mbG9hdDogdHJ1ZQogICAgICAgIGNvZGVfZG93bmxvYWQ6IHRydWUKY3NzOiBbIi4uL2ZpbGVzL2Nzcy9jb3Vyc2VfaHRtbC5jc3MiXQotLS0KCmBgYHtyIHNldHVwLCBpbmNsdWRlPUZBTFNFfQprbml0cjo6b3B0c19jaHVuayRzZXQoZWNobyA9IFRSVUUpCmBgYAoKIyBJbiBnZW5lcmFsCgpJbiBSIHRoZXJlIGFyZSBzZXZlcmFsIHR5cGUgb2Ygc3BlY2lhbCB2YWx1ZXMgc3VjaCBhcyBgTkFgLCBgTmFOYCBhbmQgYE5VTExgLiBUaGV5IGFyZSBzaW1pbGFyIGJ1dCBhdCB0aGUgc2FtZSB0aW1lIGRpZmZlcmVudCBlc3BlY2lhbGx5IHdoZW4gZGlyZWN0bHkgdGVzdGVkLiBJbiBnZW5lcmFsOgoKLSBgTkFgIGlzIGEgbWlzc2luZyBpbmZvcm1hdGlvbgotIGBOYU5gIG1lYW5zICpub3QgYSBudW1iZXIqIGFuZCBpcyB0aGUgcmVzdWx0IG9mIGFuIG5vdC1kZWZpbmVkIG1hdGggb3BlcmF0aW9uIGxpa2UgJFxmcmFjezB9ezB9JC4KLSBgTlVMTGAgaXMgdGhlIGFic2VuY2Ugb2YgYW55IGluZm9ybWF0aW9uCgojIFR5cGUKCkluIHRlcm1zIG9mIGRhdGEgdHlwZSwgYE5BYCBpcyAqbG9naWNhbCosIGBOYU5gIGlzICpudW1lcmljKiB0eXBlIGFuZCBgTlVMTGAgZG8gbm90IGhhdmUgYSBzcGVjaWZpYyB0eXBlLiBBIHBhcnRpY3VsYXJpdHkgb2YgYE5BYCBpcyB0aGF0IGNhbiBiZSBhbHNvIGFkYXB0ZWQgdG8gdGhlIHR5cGUgb2YgdmVjdG9yIHdoZXJlIGlzIGxvY2F0ZWQuIEluIFIgd2UgY2Fubm90IGhhdmUgYSB2ZWN0b3Igb2YgYG51bWJlcnNgIGFuZCBgbG9naWNhbGAgdmFsdWVzOgoKYGBge3J9CmlzLmxvZ2ljYWwoTkEpCmlzLmxvZ2ljYWwoTmFOKQppcy5sb2dpY2FsKE5VTEwpCgp2ZWMgPC0gYygxLDIsMyw0LCBUUlVFLCA1LCBGQUxTRSkKdmVjICMgVFJVRSBpcyAxIGFuZCBGQUxTRSBpcyAwCmBgYAoKQnV0IHdlIGNhbiBoYXZlIGEgKm51bWVyaWMqLCAqY2hhcmFjdGVyKiBvciAqbG9naWNhbCogdmVjdG9yIHdpdGggYE5BYCB2YWx1ZXMgYW5kIHRoZSBgTkFgIGlzIGZvcmNlZCB0byB0aGUgc3BlY2lmaWMgdHlwZToKCmBgYHtyfQojIE5BIGFsb25lIGlzIGxvZ2ljYWwgYnV0Cgp2ZWMgPC0gYygxLDIsMyw0LE5BLDUsNikKY2xhc3ModmVjKQoKZm9yKGkgaW4gdmVjKSBwcmludChjbGFzcyhpKSkKCiMgbm93IE5BIGlzIG51bWVyaWMKYGBgCgpUaGlzIGlzIHBvc3NpYmxlIGJlY2F1c2UgdGhlcmUgYXJlIHNldmVyYWwgdHlwZSBvZiBgTkFgIHZhbHVlcyB0aGF0IGFyZSBub3QgdXN1YWxseSBlbXBsb3llZCBkaXJlY3RseSBidXQgYXJlIHVzZWQgZnJvbSBSIGRlcGVuZGluZyBvbiB0aGUgdmVjdG9yOgoKYGBge3J9CmlzLmNoYXJhY3RlcihOQV9jaGFyYWN0ZXJfKQppcy5udW1lcmljKE5BX3JlYWxfKQppcy5pbnRlZ2VyKE5BX2ludGVnZXJfKQoKIyBUaGlzCgp2ZWMgPC0gYygxLDIsMyw0LDUsTkEpCnZlYwoKIyBpcyB0aGUgc2FtZSBhcwoKdmVjIDwtIGMoMSwyLDMsNCw1LE5BX2ludGVnZXJfKQp2ZWMKYGBgCgpUaGUgYE5hTmAgaXMgYSBudW1lcmljIHR5cGUgYmVjYXVzZSBpcyB0aGUgcmVzdWx0IG9mICp1bmRlZmluZWQgb3BlcmF0aW9ucyo6CgpgYGB7cn0KaXMubnVtZXJpYyhOYU4pCgowLzAKCnZlYyA8LSBjKDEsMiwzLDQsTmFOKQp2ZWMKYGBgCgpUaGUgYE5VTExgIHZhbHVlIGlzIHN1cmVseSB0aGUgc3RyYW5nZXN0IGJlY2F1c2UgcmVwcmVzZW50cyB0aGUgYWJzZW5jZSBvZiBhbnkgdmFsdWUgYW5kIHRoZSBjbGFzcyBpcyBgTlVMTGAgaXRzZWxmIG1lYW5pbmcgdGhhdCBpcyBkaWZmZXJlbnQgZnJvbSBgTkFgIGFuZCBgTmFOYCB2YWx1ZXMuCgpgYGB7cn0KeCA8LSBOVUxMCmNsYXNzKHgpICMgdGhlIGNsYXNzIGlzIE5VTEwKYGBgCkNvbXBhcmVkIHRvIGBOQWAgYW5kIGBOYU5gIHRoYXQgYXJlIGFzc29jaWF0ZSB3aXRoIHNvbWUgaW5mb3JtYXRpb24gKGFic2VuY2Ugb2YgdmFsdWUgYW5kIHVuZGVmaW5lZCBudW1iZXIpLCBgTlVMTGAgdmFsdWVzIGFyZSBzb21laG93IHRyYW5zcGFyZW50IGFuZCBjYW5ub3QgYmUgc3RvcmVkIGluIHZlY3RvcnM6CgpgYGB7cn0KdmVjIDwtIGMoMSwyLDMsNCw1LCBOQSwgOCwgTmFOLCAxMSwgTlVMTCkKdmVjICMgdGhlIG51bGwgdmFsdWUgaXMgbm90IHByZXNlbnQKYGBgCgojIFRoZSBwcm9ibGVtIHdpdGggYE5BYAoKQXMgSGFkbGV5IHN1Z2dlc3RbXm5hX2hhZGxleV0gdGhlIGBOQWAgdmFsdWVzIGluZmVjdCBhbGwgb3RoZXIgY29tcHV0YXRpb25zLiBQcmFjdGljYWxseSBtYW55IFIgZnVuY3Rpb25zIHN1Y2ggYXMgYG1lYW4oKWAgb3IgYHNkKClgIGNhbm5vdCByZXR1cm4gYSB2YWx1ZSBpZiB0aGVyZSBpcyBhIGBOQWAgd2l0aGluIHRoZSB0YXJnZXQgdmVjdG9yLgoKYGBge3J9CnggPC0gYyhydW5pZigxMCksIE5BKQptZWFuKHgpCnNkKHgpCmBgYAoKSW4gZmFjdCwgdGhlc2UgZnVuY3Rpb25zIGhhdmUgYSBzcGVjaWZpYyBhcmd1bWVudCBgbmEucm0gPSBUUlVFYCBmb3IgZG9pbmcgdGhlIGNvbXB1dGF0aW9uIHdpdGhvdXQgY29uc2lkZXJpbmcgYE5BYCB2YWx1ZXMuIE9mIGNvdXJzZSB3ZSBjYW4gcmVtb3ZlIGBOQWAgdmFsdWVzIGJlZm9yZSB0aGUgY29tcHV0YXRpb24gYW5kIHRoZSByZXN1bHQgd2lsbCBiZSB0aGUgc2FtZToKCmBgYHtyfQptZWFuKHgsIG5hLnJtID0gVFJVRSkKbWVhbih4WyFpcy5uYSh4KV0pCmBgYAoKW15uYV9oYWRsZXldOiAKCiMgU291cmNlcwoKLSBodHRwOi8vd3d3LmNvb2tib29rLXIuY29tL0Jhc2ljcy9Xb3JraW5nX3dpdGhfTlVMTF9OQV9hbmRfTmFOLwotIGh0dHBzOi8vd3d3LnByb2plY3Rwcm8uaW8vcmVjaXBlcy93aGF0LWlzLWRpZmZlcmVuY2UtYmV0d2Vlbi1uYS1hbmQtbmFuLXI=