Замените все NA с FALSE в выбранных столбцах в R
У меня есть вопрос, похожий на этот, но мой набор данных немного больше: 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
, как это можно сделать?
Ответы
Ответ 1
Если вы хотите заменить подмножество переменных, вы все равно можете использовать трюк 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
Ответ 2
Попробуйте этот код:
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)
Ответ 3
Вы можете использовать функцию NAToUnknown
в пакете gdata
df[,c('x1', 'x2')] = gdata::NAToUnknown(df[,c('x1', 'x2')], unknown = 'FALSE')
Ответ 4
С помощью dplyr
вы также можете сделать
df %>% mutate_each(funs(replace(., is.na(.), F)), x1, x2)
Это немного менее читаемо по сравнению с использованием replace()
, но более общим, поскольку позволяет выбирать столбцы, которые нужно преобразовать. Это решение особенно применимо, если вы хотите сохранить NA в некоторых столбцах, но хотите избавиться от NA в других.
Ответ 5
tidyr::replace_na
отличная функция.
df %>%
replace_na(list(x1 = FALSE, x2 = FALSE))
Это очень быстрое решение. единственным трюком является составление списка столбцов, которые вы хотите изменить.