【发布时间】:2021-06-10 16:30:50
【问题描述】:
我有一个包含许多数字数据列的数据框,并与相应的质量列配对。
在下面的示例中,dat 是一个数据框,其数字列 v1 和 v3 与质量控制列 v1_a 和 v3_a 配对。 v2 没有质量控制栏。
如果v1_a 和v3_a 中的对应值是“A”或“D”,我想将v1 和v3 中的所有值设置为NA_real_。我正在 dplyr 中寻找一种方法,并使用 %>% 可以扩展到任意数量的配对数字和质量控制列。
set.seed(10)
dat <- tibble(v1 = runif(10)
, v1_a = c("A", "A", NA, "B", NA, NA, NA, "D", NA, "A" )
, v2 = runif(10)
, v3 = runif(10)
, v3_a = c(NA, "A", "D", "B", NA, "A", NA, "A", NA, "A" ))
dat
v1 v1_a v2 v3 v3_a
1 0.536 A 0.275 0.354 NA
2 0.0931 A 0.229 0.936 A
3 0.170 NA 0.0144 0.246 D
4 0.900 B 0.729 0.473 B
5 0.423 NA 0.250 0.192 NA
6 0.748 NA 0.161 0.583 A
7 0.823 NA 0.0170 0.459 NA
8 0.955 D 0.486 0.467 A
9 0.685 NA 0.103 0.400 NA
10 0.501 A 0.802 0.505 A
对于上述示例数据,假设我要筛选“A”和“D”(而不是“B”或 NA),结果将是:
v1 v1_a v2 v3 v3_a
1 NA A 0.275 0.354 NA
2 NA A 0.229 NA A
3 0.170 NA 0.0144 NA D
4 0.900 B 0.729 0.473 B
5 0.423 NA 0.250 0.192 NA
6 0.748 NA 0.161 NA A
7 0.823 NA 0.0170 0.459 NA
8 NA D 0.486 NA A
9 0.685 NA 0.103 0.400 NA
10 NA A 0.802 NA A
为了创建上述内容,我为每个感兴趣的列使用了case_when 帮助函数,如下所示
rmkQC <- c("A","D") # vector of values to screen
dat %>%
mutate(v1 = case_when(v1_a %in% rmkQC ~ NA_real_
, TRUE ~ v1)
, v3 = case_when(v3_a %in% rmkQC ~ NA_real_
, TRUE ~ v3))
我需要做的是概括这一点,以便它可以应用于具有未知数量的成对列的数据框。不确定这是否重要,但我可以使用以下代码识别配对列。
colQC <- names(dat)[grep("_a" , names(dat))]
colV <- sub("_a$","",colQC)
【问题讨论】: