いくつかの数値列を持つデータフレームがあります。一部の行には 0 の値があり、統計分析では null と見なされる必要があります。Rですべての0値をNULLに置き換える最速の方法は何ですか?
9 に答える
すべてのゼロをNAに置き換える:
df[df == 0] <- NA
説明
1.NULL
ゼロを置き換えたいものではありません。で言うように?'NULL'
、
NULLは、Rのnullオブジェクトを表します
これはユニークで、おそらく最も情報量が少なく、空のオブジェクトと見なすことができます。1そうすれば、それほど驚くことではなくなります。
data.frame(x = c(1, NULL, 2))
# x
# 1 1
# 2 2
つまり、Rはこのnullオブジェクト用のスペースを予約しません。2その間、?'NA'
私達はそれを見る
NAは、長さ1の論理定数であり、欠落値インジケーターが含まれています。NAは、rawを除く他の任意のベクトルタイプに強制変換できます。
重要なのNA
は、長さが1であるため、Rはそのためのスペースを確保することです。例えば、
data.frame(x = c(1, NA, 2))
# x
# 1 1
# 2 NA
# 3 2
また、データフレーム構造では、「穴」(つまりNULL
値)が存在しないように、すべての列に同じ数の要素が必要です。
NULL
これで、少なくとも1つのゼロを含むすべての行を完全に削除するという意味で、データフレーム内のゼロを置き換えることができます。たとえば、、、またはを使用する場合var
、cov
これcor
は実際には、最初にゼロをに置き換えて、の値をとしてNA
設定することと同じです。ただし、通常、これは余分な情報の損失につながるため、不十分です。use
"complete.obs"
2.ある種のループを実行する代わりに、ソリューションではdf == 0
ベクトル化を使用します。エントリと。を含む、df == 0
と同じサイズの行列を返します(試してみてください)。さらに、この行列をサブセットに渡すこともできます(を参照)。最後に、の結果は完全に直感的ですが、目的の効果が得られるのは奇妙に思えるかもしれません。代入演算子は確かに必ずしも賢いわけではなく、他のオブジェクトではこのように機能しませんが、データフレームでは機能します。を参照してください。df
TRUE
FALSE
[...]
?'['
df[df == 0]
df[df == 0] <- NA
<-
?'<-'
1集合論の空集合はどういうわけか関連しているように感じます。
2集合論とのもう1つの類似点:空の集合はすべての集合のサブセットですが、そのためのスペースは予約していません。
data.frame は異なるデータ型が混在しており、すべての列を変更する必要はないと仮定しましょう。
列 12 から 18 (合計 21 のうち) のみを変更するには、次のようにします。
df[, 12:18][df[, 12:18] == 0] <- NA
関数を使用しない別の方法[<-
:
サンプルデータフレームdat
(@Chaseの回答から恥知らずにコピー):
dat
x y
1 0 2
2 1 2
3 1 1
4 2 1
5 0 0
NA
ゼロは関数で置き換えることができますis.na<-
:
is.na(dat) <- !dat
dat
x y
1 NA 2
2 1 2
3 1 1
4 2 1
5 NA NA
#Sample data
set.seed(1)
dat <- data.frame(x = sample(0:2, 5, TRUE), y = sample(0:2, 5, TRUE))
#-----
x y
1 0 2
2 1 2
3 1 1
4 2 1
5 0 0
#replace zeros with NA
dat[dat==0] <- NA
#-----
x y
1 NA 2
2 1 2
3 1 1
4 2 1
5 NA NA
誰かがこれの Data.Table バージョンを要求し、指定された data.frame ソリューションが data.table では機能しないため、以下のソリューションを提供します。
基本的には:=
演算子 -->を使いますDT[x == 0, x := NA]
library("data.table")
status = as.data.table(occupationalStatus)
head(status, 10)
origin destination N
1: 1 1 50
2: 2 1 16
3: 3 1 12
4: 4 1 11
5: 5 1 2
6: 6 1 12
7: 7 1 0
8: 8 1 0
9: 1 2 19
10: 2 2 40
status[N == 0, N := NA]
head(status, 10)
origin destination N
1: 1 1 50
2: 2 1 16
3: 3 1 12
4: 4 1 11
5: 5 1 2
6: 6 1 12
7: 7 1 NA
8: 8 1 NA
9: 1 2 19
10: 2 2 40
0
数値フィールドでのみ (つまり、係数などを除外して) で置き換えることができますがNA
、列ごとに機能します。
col[col == 0 & is.numeric(col)] <- NA
関数を使用すると、これをデータ フレーム全体に適用できます。
changetoNA <- function(colnum,df) {
col <- df[,colnum]
if (is.numeric(col)) { #edit: verifying column is numeric
col[col == -1 & is.numeric(col)] <- NA
}
return(col)
}
df <- data.frame(sapply(1:5, changetoNA, df))
1:5
をデータ フレームの列数または に置き換えることもできますが、 1:ncol(df)
.