web-dev-qa-db-ja.com

NAを因子レベルに変換

新しい因子レベルNAで置き換えたいNA値を持つベクトルがあります。

a = as.factor(as.character(c(1, 1, 2, 2, 3, NA)))
a
[1] 1    1    2    2    3    <NA>
Levels: 1 2 3

これは機能しますが、奇妙な方法のようです。

a = as.factor(ifelse(is.na(a), "NA", a))
class(a)
[1] "factor"

これは予想される出力です。

a
[1] 1  1  2  2  3  NA
Levels: 1 2 3 NA
32
marbel

addNA()を使用できます。

_x <- c(1, 1, 2, 2, 3, NA)
addNA(x)
# [1] 1    1    2    2    3    <NA>
# Levels: 1 2 3 <NA>
_

これは基本的に_exclude = NULL_で因数分解するための便利な関数です。 help(factor)から-

addNAは、NAを特別なレベルに変更することで係数を変更します(たとえば、NA値はテーブルでカウントされます)。

これがナイスであるもう1つの理由は、すでにf因子がある場合、addNA()を使用して、NAを変更せずにfを因子レベルとしてすばやく追加できるためです] _。ドキュメントで述べたように、これはテーブルに便利です。また、読みやすいです。

49
Rich Scriven

ExcludesをNULLに設定して、レベルとしてNAを含めます(as.factorの代わりにfactorを使用します。同じことを行い、設定する引数がさらにあります)。

a = factor(as.character(c(1, 1, 2, 2, 3, NA)), exclude = NULL)

> a
[1] 1    1    2    2    3    <NA>
Levels: 1 2 3 <NA>
17
LyzandeR

NAをレベルとして追加し、パッケージforcats<NA>を使用して、レベル名をfct_explicit_naより明示的な名前に変更できます。

library(forcats)

デフォルトでは、(Missing)として新しいレベルを取得します:

fct_explicit_na(a)

[1] 1         1         2         2         3         (Missing)
Levels: 1 2 3 (Missing)

他の何かに設定できます:

fct_explicit_na(a, "unknown")

[1] 1       1       2       2       3       unknown
Levels: 1 2 3 unknown
16
aosmith