Вы также можете использовать mutate_at
с table
library(tidyverse)
mtcars %>%
mutate_at(vars(cyl, gear), ~ {
t <- table(.)
ifelse(. %in% names(t[t < 10]), NA, .)})
Эту функцию можно упростить до одной строки с помощью purrr::keep
mtcars %>%
mutate_at(vars(cyl, gear),
~ ifelse(. %in% names(keep(table(.), `<`, 10)), NA, .))
Или, если вы оказалисьработая с таблицей data.table, вы можете использовать «обновление соединения» для подмножества групп с низким числом, а затем назначить NA
этому подмножеству
library(data.table)
dt <- as.data.table(mtcars)
for(x in c('cyl', 'gear'))
dt[dt[, .N, x][N < 10], on = x, (x) := NA]
Это приведет к тому же результату
all.equal(
dt,
mtcars %>%
mutate_at(vars(cyl, gear),
~ ifelse(. %in% names(keep(table(.), `<`, 10)), NA, .)) %>%
setDT
)
# [1] TRUE