Подтвердить что ты не робот

Установите NA в 0 в R

После слияния кадра данных с другим 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)
    })

Где $x.x - один столбец, а $x.y - другой, конечно, но это, похоже, не работает.

4b9b3361

Ответ 1

Вы можете просто использовать вывод 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

Ответ 2

Решение, использующее mutate_all из dplyr, если вы хотите добавить это в свой конвейер dplyr:

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

Результат:

   A B C
1  1 1 2
2  2 2 5
3  3 1 2
4  0 2 0
5  1 1 0
6  2 2 0
7  3 1 3
8  0 2 0
9  1 1 3
10 2 2 3
11 3 1 0
12 0 2 3
13 1 1 4
14 2 2 4
15 3 1 0
16 0 2 0
17 1 1 1
18 2 2 0
19 3 1 2
20 0 2 0

Если в любом случае вы хотите заменить 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  1  0 2
2  2 NA 5
3  3  0 2
4  0 NA 0
5  1  0 0
6  2 NA 0
7  3  0 3
8  0 NA 0
9  1  0 3
10 2 NA 3
11 3  0 0
12 0 NA 3
13 1  0 4
14 2 NA 4
15 3  0 0
16 0 NA 0
17 1  0 1
18 2 NA 0
19 3  0 2
20 0 NA 0

Данные:

set.seed(123)
df <- data.frame(A=rep(c(0:3, NA), 5), B=rep(c("0", "NA"), 10), C=c(sample(c(0:5, NA), 20, replace = TRUE)))

Ответ 3

Чтобы добавить к примеру Джеймса, кажется, вам всегда нужно создавать промежуточное звено при выполнении вычислений на фреймах данных, содержащих NA.

Например, добавление двух столбцов (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.

Ответ 4

Почему бы не попробовать этот

  na.zero <- function (x) {
        x[is.na(x)] <- 0
        return(x)
    }
    na.zero(df)