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

问题描述 投票:0回答:1

如果满足条件,我将尝试用跨多列的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结尾的列,因此与组件匹配的选择用户非常重要。

谢谢您的帮助!

r if-statement replace dplyr na
1个回答
0
投票
我们可以使用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)

© www.soinside.com 2019 - 2024. All rights reserved.