183

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

4

9 に答える 9

306

すべてのゼロを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と同じサイズの行列を返します(試してみてください)。さらに、この行列をサブセットに渡すこともできます(を参照)。最後に、の結果は完全に直感的ですが、目的の効果が得られるのは奇妙に思えるかもしれません。代入演算子は確かに必ずしも賢いわけではなく、他のオブジェクトではこのように機能しませんが、データフレームでは機能します。を参照してください。dfTRUEFALSE[...]?'['df[df == 0]df[df == 0] <- NA<-?'<-'


1集合論の空集合はどういうわけか関連しているように感じます。
2集合論とのもう1つの類似点:空の集合はすべての集合のサブセットですが、そのためのスペースは予約していません。

于 2012-06-14T16:09:45.513 に答える
48

data.frame は異なるデータ型が混在しており、すべての列を変更する必要はないと仮定しましょう。

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

df[, 12:18][df[, 12:18] == 0] <- NA
于 2015-02-20T14:08:32.130 に答える
23

関数を使用しない別の方法[<-:

サンプルデータフレーム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
于 2013-01-06T11:56:46.587 に答える
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
于 2012-06-14T16:11:26.367 に答える
13

誰かがこれの 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
于 2016-06-02T00:58:09.240 に答える
4

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).

于 2015-01-24T19:46:44.270 に答える