すべての0値をNAに置き換えます


144

数値列のあるデータフレームがあります。一部の行には0の値があり、統計分析ではnullと見なされます。Rですべての0値をNULLに置き換える最も速い方法は何ですか?


17
私はあなたがNULL値を望んでいる/置き換えることができるとは思いませんが、NAはR用語でその目的を果たします。
追跡

回答:


243

すべてのゼロを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つのゼロを含むすべての行を完全に削除するという意味で、データフレームでゼロを置き換えることができます。例えば、使用する場合varcovまたはcor、実際には最初とゼロに置き換えると等価であるNAとの値の設定useなどを"complete.obs"。ただし、通常、これは余分な情報の損失につながるため、不十分です。

2.ある種のループを実行する代わりに、ソリューションではdf == 0ベクトル化を使用します。df == 0戻る(それを試してください)と同じサイズの行列dfエントリを有する、TRUEおよびFALSE。さらに、この行列をサブセットに渡すこともできます[...](を参照?'[')。最後に、の結果df[df == 0]は完全に直感的ですdf[df == 0] <- NAが、望ましい効果が得られるのは奇妙に思えるかもしれません。<-実際、代入演算子は必ずしもそれほど賢くなく、他の一部のオブジェクトではこのように機能しませんが、データフレームでは機能します。参照してください?'<-'


1セット理論の空のセットは、何らかの形で関連していると感じています。
2セット理論とのもう1つの類似点:空のセットはすべてのセットのサブセットですが、スペースを予約していません。


3
data.tableオブジェクトの同等の構文は何ですか?
itpetersen 2014

6
多くの票を獲得しているようですが、これが<NA>への設定を要求されなかった、値が「0」の非数値列のエッジケースを適切にカバーしているとは思いません。
IRTFM 2014

33

data.frameが異なるデータ型の混合であり、すべての列を変更する必要があるわけではないと仮定します。

(合計21の)列12から18のみを変更するには、次のようにします。

df[, 12:18][df[, 12:18] == 0] <- NA

これは私には
有効です

23

[<-関数なしの代替方法:

サンプルデータフレームdat(@Chaseの回答から恥知らずにコピーされたもの):

dat

  x y
1 0 2
2 1 2
3 1 1
4 2 1
5 0 0

ゼロは次NAis.na<-関数で置き換えることができます:

is.na(dat) <- !dat


dat

   x  y
1 NA  2
2  1  2
3  1  1
4  2  1
5 NA NA

22

dplyr::na_if() オプションです:

library(dplyr)  

df <- data_frame(col1 = c(1, 2, 3, 0),
                 col2 = c(0, 2, 3, 4),
                 col3 = c(1, 0, 3, 0),
                 col4 = c('a', 'b', 'c', 'd'))

na_if(df, 0)
# A tibble: 4 x 4
   col1  col2  col3 col4 
  <dbl> <dbl> <dbl> <chr>
1     1    NA     1 a    
2     2     2    NA b    
3     3     3     3 c    
4    NA     4    NA d

14
#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

12

誰かがこれの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

2
またはfor (j in names(DT)); set(DT,which(DT[[j]] == 0),j,NA)。data.tableを使用して値を検索および置換する方法の詳細については、ここを参照してください。
JWilliman、2016年

4

あなたは置き換えることができ0NA数値フィールドのみに(すなわち要因のようなものを除く)が、それは、列ごとに動作します:

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)


これが正しい解決策かどうかはわかりません。6列目以降はどうでしょうか。彼らはカットされます。
userJT 2015

そのため、最後に1:5と置き換えることを提案し1:ncol(df)ました。方程式を複雑にしたり、読みにくくしたりしたくありませんでした。
Alium Britt 2015

しかし、列6および7の場合-データ型はcharであり、置換は行われません。私の問題では、列12から15のみを交換する必要がありますが、df全体には21列があります(多くの場合、まったく変更しないでください)。
userJT 2015

データフレームの場合は、1:5を変更したい列番号に変更するだけですが、12:15数値列のみに影響することを確認したい場合は、関数の2行目をifステートメントで次のようにラップしますif (is.numeric(col)) { col[col == -1 & is.numeric(col)] <- NA }
Alium Britt

0

誰かが逆を探してグーグル経由でここに到着した場合(つまり、data.frame内のすべてのNAを0に置き換える方法)、答えは

df[is.na(df)] <- 0

または

dplyr / tidyverseの使用

library(dplyr)
mtcars %>% replace(is.na(.), 0)
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.