Заменить пользовательские значения на NA - PullRequest
1 голос
/ 08 февраля 2020
df = data.frame("a" = c(1, 2, 3, "q", "r"),
                "b" = c(5,6,7,0,"s"))
dfWANT = data.frame("a" = c(1, 2, 3, "NA", "NA"),
                    "b" = c(5,6,7,0,"NA"))
REP = c("q", "r", "s")

df[,][df[,] == REP] <- NA

Я стремлюсь указать список (REP), в котором есть баллы, которые я хочу установить на NA. Исходные данные df, а я хочу dfWANT. REP - это вектор значений, которые я хочу установить на NA, а последняя строка - моя попытка, которая работает только на столбце.

Ответы [ 2 ]

3 голосов
/ 08 февраля 2020

Вы можете использовать sapply, чтобы получить логическую матрицу значения TRUE / FALSE, основанную на существовании в ней значения REP. Затем мы можем заменить эти TRUE значения на NA.

df[sapply(df, `%in%`, REP)] <- NA

#     a    b
#1    1    5
#2    2    6
#3    3    7
#4 <NA>    0
#5 <NA> <NA>

В dplyr мы можем использовать mutate_all

library(dplyr)
df %>% mutate_all(~replace(., . %in% REP, NA))
1 голос
/ 08 февраля 2020

Мы можем преобразовать data.frame в matrix и сделать %in% без зацикливания в base R

df[`dim<-`(as.matrix(df) %in% REP, dim(df))] <- NA
df
#     a    b
#1    1    5
#2    2    6
#3    3    7
#4 <NA>    0
#5 <NA> <NA>

или используя эффективные data.table

library(data.table)
setDT(df)
for(j in seq_along(df)) set(df, i = which(df[[j]] %in% REP),  j=j, value = NA_character_)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...