Заменить все NA на FALSE в выбранных столбцах в R - PullRequest
16 голосов
/ 02 сентября 2011

У меня есть вопрос, похожий на этот , но мой набор данных немного больше: 50 столбцов с 1 столбцом в качестве UID и другие столбцы, содержащие TRUE или NA, я хочу изменитьвсе от NA до FALSE, но я не хочу использовать явный цикл.

Может ли plyr добиться цели?Спасибо.

ОБНОВЛЕНИЕ # 1

Спасибо за быстрый ответ, но что делать, если мой набор данных похож на ниже:

df <- data.frame(
  id = c(rep(1:19),NA),
  x1 = sample(c(NA,TRUE), 20, replace = TRUE),
  x2 = sample(c(NA,TRUE), 20, replace = TRUE)
)

Я хочу только X1 и X2для обработки, как это можно сделать?

Ответы [ 5 ]

29 голосов
/ 02 сентября 2011

Если вы хотите заменить подмножество переменных, вы все равно можете использовать трюк is.na(*) <-, как показано ниже:

df[c("x1", "x2")][is.na(df[c("x1", "x2")])] <- FALSE

IMO, использующий временные переменные, упрощает логику:

vars.to.replace <- c("x1", "x2")
df2 <- df[vars.to.replace]
df2[is.na(df2)] <- FALSE
df[vars.to.replace] <- df2
9 голосов
/ 02 сентября 2011

Попробуйте этот код:

df <- data.frame(
  id = c(rep(1:19), NA),
  x1 = sample(c(NA, TRUE), 20, replace = TRUE),
  x2 = sample(c(NA, TRUE), 20, replace = TRUE)
)
replace(df, is.na(df), FALSE)

ОБНОВЛЕНО для другого решения.

df2 <- df <- data.frame(
  id = c(rep(1:19), NA),
  x1 = sample(c(NA, TRUE), 20, replace = TRUE),
  x2 = sample(c(NA, TRUE), 20, replace = TRUE)
)
df2[names(df) == "id"] <- FALSE
df2[names(df) != "id"] <- TRUE
replace(df, is.na(df) & df2, FALSE)
6 голосов
/ 19 сентября 2016

tidyr::replace_na отличная функция.

df %>%
  replace_na(list(x1 = FALSE, x2 = FALSE))

Это отличное быстрое решение.единственный трюк в том, чтобы составить список столбцов, которые вы хотите изменить.

4 голосов
/ 27 марта 2015

С dplyr вы также можете сделать

df %>% mutate_each(funs(replace(., is.na(.), F)), x1, x2)

Это немного менее читабельно по сравнению с просто с использованием replace(), но более универсально, поскольку позволяет выбирать столбцы длябыть преобразованным.Это решение особенно применимо, если вы хотите сохранить NA в некоторых столбцах, но хотите избавиться от NA в других.

4 голосов
/ 02 сентября 2011

Вы можете использовать функцию NAToUnknown в пакете gdata

df[,c('x1', 'x2')] = gdata::NAToUnknown(df[,c('x1', 'x2')], unknown = 'FALSE')
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...