回答:
すべてのゼロを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つの類似点:空のセットはすべてのセットのサブセットですが、スペースを予約していません。
[<-
関数なしの代替方法:
サンプルデータフレーム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
誰かがこれの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
for (j in names(DT)); set(DT,which(DT[[j]] == 0),j,NA)
。data.tableを使用して値を検索および置換する方法の詳細については、ここを参照してください。
あなたは置き換えることができ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)
。
1:5
と置き換えることを提案し1:ncol(df)
ました。方程式を複雑にしたり、読みにくくしたりしたくありませんでした。
1:5
を変更したい列番号に変更するだけですが、12:15
数値列のみに影響することを確認したい場合は、関数の2行目をifステートメントで次のようにラップしますif (is.numeric(col)) { col[col == -1 & is.numeric(col)] <- NA }
。