如果在R中满足条件,则用多列中的NA替换值

时间:2020-01-11 23:23:47

标签: r if-statement replace dplyr na

如果条件满足,我试图用多列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))

当num_in_dept为1时,我希望包含cent_dept _。* _ agg的列为NA,所以它看起来像这样:

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 :: matches(“ cent_dept _。* _ agg”),但我不知道解决方案。

在我的实际数据集中,我有许多以cent_dept开头并以agg结尾的列,因此与组件匹配的选择用户非常重要。

谢谢您的帮助!

1 个答案:

答案 0 :(得分:1)

我们可以使用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)
相关问题