32

データフレームを別のimとマージした後、時折行にランダムなNAが残ります。これらのNAを0に設定して、計算を実行できるようにします。

私はこれをしようとしています:

    bothbeams.data = within(bothbeams.data, {
      bothbeams.data$x.x = ifelse(is.na(bothbeams.data$x.x) == TRUE, 0, bothbeams.data$x.x)
      bothbeams.data$x.y = ifelse(is.na(bothbeams.data$x.y) == TRUE, 0, bothbeams.data$x.y)
    })

もちろん、$ xxは一方の列で、$ xyはもう一方の列ですが、これは機能していないようです。

4

5 に答える 5

68

の出力を使用してis.na、サブセットに直接置き換えることができます。

bothbeams.data[is.na(bothbeams.data)] <- 0

または再現可能な例で:

dfr <- data.frame(x=c(1:3,NA),y=c(NA,4:6))
dfr[is.na(dfr)] <- 0
dfr
  x y
1 1 0
2 2 4
3 3 5
4 0 6

ただし、欠測値もある因子を含むデータフレームでこのメソッドを使用する場合は注意が必要です。

> d <- data.frame(x = c(NA,2,3),y = c("a",NA,"c"))
> d[is.na(d)] <- 0
Warning message:
In `[<-.factor`(`*tmp*`, thisvar, value = 0) :
  invalid factor level, NA generated

できます":

> d
  x    y
1 0    a
2 2 <NA>
3 3    c

...ただし、この場合、データフレーム全体ではなく、数値列のみを具体的に変更することをお勧めします。たとえば、を使用して以下の回答を参照してdplyr::mutate_ifください。

于 2012-04-13T10:43:45.013 に答える
20

それをパイプラインに追加したい場合にmutate_allfromを使用するソリューション:dplyrdplyr

library(dplyr)
df %>%
  mutate_all(funs(ifelse(is.na(.), 0, .)))

結果:

   A B C
1  0 0 0
2  1 0 0
3  2 0 2
4  3 0 5
5  0 0 2
6  0 0 1
7  1 0 1
8  2 0 5
9  3 0 2
10 0 0 4
11 0 0 3
12 1 0 5
13 2 0 5
14 3 0 0
15 0 0 1

いずれにせよ、数値列のNAのみを置き換えたい場合は、モデリングの場合と思われますが、次を使用できますmutate_if

library(dplyr)
df %>%
  mutate_if(is.numeric, funs(ifelse(is.na(.), 0, .)))

またはベースR:

replace(is.na(df), 0)

結果:

   A    B C
1  0    0 0
2  1 <NA> 0
3  2    0 2
4  3 <NA> 5
5  0    0 2
6  0 <NA> 1
7  1    0 1
8  2 <NA> 5
9  3    0 2
10 0 <NA> 4
11 0    0 3
12 1 <NA> 5
13 2    0 5
14 3 <NA> 0
15 0    0 1

アップデート

dplyr 1.0.0acrossが導入されました:

library(dplyr)
# Replace `NA` for all columns
df %>%
  mutate(across(everything(), ~ ifelse(is.na(.), 0, .)))

# Replace `NA` for numeric columns
df %>%
  mutate(across(where(is.numeric), ~ ifelse(is.na(.), 0, .)))

データ:

set.seed(123)
df <- data.frame(A=rep(c(0:3, NA), 3), 
                 B=rep(c("0", NA), length.out = 15), 
                 C=sample(c(0:5, NA), 15, replace = TRUE))
于 2017-09-15T15:29:03.100 に答える
1

Jamesの例に追加すると、NAを含むデータフレームで計算を実行するときは、常に中間体を作成する必要があるようです。

たとえば、データフレームから2つの列(AとB)を一緒に追加しますdfr

temp.df <- data.frame(dfr) # copy the original
temp.df[is.na(temp.df)] <- 0
dfr$C <- temp.df$A + temp.df$B # or any other calculation
remove('temp.df')

これを行うときは、後でremove/を使用して中間体を破棄しrmます。

于 2015-03-01T14:17:04.863 に答える
1

パッケージreplace_na()から使用できますtidyr

df %>% replace_na(list(column1 = 0, column2 = 0)

于 2021-04-19T17:04:20.497 に答える
-1

これを試してみませんか

  na.zero <- function (x) {
        x[is.na(x)] <- 0
        return(x)
    }
    na.zero(df)
于 2017-02-04T09:09:21.950 に答える