заменить значения с NA на несколько столбцов, если условие выполняется в R - PullRequest
1 голос
/ 12 января 2020

Я пытаюсь заменить значения в значениях NA на несколько столбцов, если выполняется условие.

Вот пример набора данных:

library(tidyverse)
sample <- tibble(id = 1:6,
                 team_score = 5:10,
                 cent_dept_test_agg = c(1, 2, 3, 4, 5, 6),
                 cent_dept_blue_agg = c(15:20),
                 num_in_dept = c(1, 1, 2, 5, 100, 6))

Я хочу столбцы, содержащие cent_dept_ . * _ agg быть NA, когда num_in_dept равен 1, поэтому это выглядит так:

library(tidyverse)
solution <- tibble(id = 1:6,
                   team_score = 5:10,
                   cent_dept_test_agg = c(NA, NA, 3, 4, 5, 6),
                   cent_dept_blue_agg = c(NA, NA, 17:20),
                   num_in_dept = c(1, 1, 2, 5, 100, 6))

Я пытался использовать replace_with_na_at (из пакета nanier ) и na_if (из пакет dplyr ), но я не могу понять это. Я знаю, что мои критерии выбора верны (dplyr :: match ("cent_dept _. * _ Agg"), но я не могу найти решение.

В моем фактическом наборе данных у меня есть много столбцов, которые начинаются с cent_dept и заканчивайте agg, поэтому очень важно, чтобы выбранные пользователи соответствовали компоненту.

Спасибо за помощь!

1 Ответ

1 голос
/ 12 января 2020

Мы можем использовать mutate_at, чтобы выбрать столбцы, которые matches 'cent_dept' и replace значения, где 'num_in_dept' равно 1

library(dplyr)
sample %>%
    mutate_at(vars(matches('^cent_dept_.*_agg$')), ~ 
                  replace(., num_in_dept == 1, NA))
# A tibble: 6 x 5
#     id team_score cent_dept_test_agg cent_dept_blue_agg num_in_dept
#  <int>      <int>              <dbl>              <int>       <dbl>
#1     1          5                 NA                 NA           1
#2     2          6                 NA                 NA           1
#3     3          7                  3                 17           2
#4     4          8                  4                 18           5
#5     5          9                  5                 19         100
#6     6         10                  6                 20           6

В base R, мы можно также сделать

nm1 <- grep('^cent_dept_.*_agg$', names(sample))
sample[nm1] <- lapply(sample[nm1], function(x) 
         replace(x, sample$num_in_dept == 1, NA))

Или это можно сделать с помощью

sample[nm1] <-  sample[nm1] * NA^(sample$num_in_dept == 1)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...