Мы можем использовать mutate_at
от dplyr
. Укажите интересующие столбцы в аргументе vars
для mutate_at
, внутри funs
, создайте логическое условие с case_when
для замены значениями, которые удовлетворяют условию
library(dplyr)
df %>%
mutate_at(vars(matches("col\\d+")),
funs(case_when(is.na(.) & as.logical(indicator)~ 10,
is.na(.) & !indicator ~ 0,
TRUE ~ .)))
# A tibble: 3 x 3
# col1 col2 indicator
# <dbl> <dbl> <dbl>
# 1 10 34 1
# 2 1 10 1
# 3 2 44 0
Это также можно сделать с помощью data.table
library(data.table)
setDT(df)
for(j in names(df)[1:2]) {
i1 <- is.na(df[[j]])
i2 <- as.logical(df[['indicator']])
set(df, i = which(i1 & i2), j = j, value = 10)
set(df, i = which(i1 & !i2), j = j, value = 0)
}
Если мы хотим, чтобы максимум столбца вместо 10 заменял значения NA
, где «индикатор» равен 1, используйте max
df %>%
mutate_at(vars(matches("col\\d+")),
funs(case_when(is.na(.) & as.logical(indicator)~ max(., na.rm = TRUE),
is.na(.) & !indicator ~ 0,
TRUE ~ .)))
# A tibble: 3 x 3
# col1 col2 indicator
# <dbl> <dbl> <dbl>
#1 2 34 1
#2 1 44 1
#3 2 44 0