dplyr::在函数中迭代列时进行mutate_

dplyr::在函数中迭代列时进行mutate_,r,dplyr,R,Dplyr,然后我使用dplyr和mutate\u at和if\u else函数。我的问题是,mutate_at会迭代col_val的所有列,但函数本身不会。我尝试了在stackoverflow上找到的几个示例,但它们似乎都不起作用 col_var <- grep("^Date.|_f$", names(df), invert = T) #不起作用 df_质量控制% 在(.vars=col_var)处突变, .funs=list(~ifelse(df[,col_var+1]==9,NA))) i=1

然后我使用
dplyr
mutate\u at
if\u else
函数。我的问题是,
mutate_at
会迭代
col_val
的所有列,但函数本身不会。我尝试了在stackoverflow上找到的几个示例,但它们似乎都不起作用

col_var <- grep("^Date.|_f$", names(df), invert = T)
#不起作用
df_质量控制%
在(.vars=col_var)处突变,
.funs=list(~ifelse(df[,col_var+1]==9,NA)))
i=1
df_质量控制%
在(.vars=col_var)处突变,
.funs=list(~ifelse(df[,i+1]==9,,,NA)))

我想我已经很接近了,非常感谢您的帮助。

我们可以使用
Map

# does not work
df_qc <- df %>%
  mutate_at(.vars = col_var,
            .funs = list(~ ifelse(df[, col_var+1] == 9, ., NA)))

i=1
df_qc <- df %>%
  mutate_at(.vars = col_var,
            .funs = list(~ ifelse(df[, i+1] == 9, ., NA)))

一个
dplyr
purrr
选项可以是:

df[col_var] <- purrr::map2(df[col_var + 1],df[col_var], ~{.y[.x != 9] <- NA;.y})
map2\u dfr(.x=df%>%
选择(以“HMP”结尾),
.y=df%>%
选择(以(“\u f”)结尾),
~replace(.x,.y!=9,NA))%>%
绑定列(df%>%
选择(以“HMP”结尾)
RH33HMP RH38HMP日期时间RH33HMP_f RH38HMP_f
1    99.6    99.6 2015-01-01 00:00:00         9         9
299.6NA 2015-01-01 00:30:009902
3 NA 99.5 2015-01-01 01:00:00 92 9
4 NA 99.3 2015-01-01 01:30:00 93 9
598.6北美2015-01-01 02:00:00 9 91

非常感谢您的努力。我接受了另一个答案,因为我想保留质量标志总是在实际测量之后的下一列的想法。您的答案需要明确的测量列名称,因为我有几个不同的仪器,名称不同,所以需要一段时间才能将它们全部列出。
df[col_var] <- Map(function(x, y) {y[x != 9] <- NA;y},df[col_var + 1],df[col_var])
df

#            Date.time RH33HMP RH33HMP_f RH38HMP RH38HMP_f
#1 2015-01-01 00:00:00   99.60         9    99.6         9
#2 2015-01-01 00:30:00   99.60         9      NA       902
#3 2015-01-01 01:00:00      NA        92    99.5         9
#4 2015-01-01 01:30:00      NA        93    99.3         9
#5 2015-01-01 02:00:00   98.63         9      NA        91
df[col_var] <- purrr::map2(df[col_var + 1],df[col_var], ~{.y[.x != 9] <- NA;.y})
map2_dfr(.x = df %>%
          select(ends_with("HMP")),
         .y = df %>%
          select(ends_with("_f")),
         ~ replace(.x, .y != 9, NA)) %>%
 bind_cols(df %>%
            select(-ends_with("HMP")))

  RH33HMP RH38HMP Date.time           RH33HMP_f RH38HMP_f
    <dbl>   <dbl> <fct>                   <dbl>     <dbl>
1    99.6    99.6 2015-01-01 00:00:00         9         9
2    99.6    NA   2015-01-01 00:30:00         9       902
3    NA      99.5 2015-01-01 01:00:00        92         9
4    NA      99.3 2015-01-01 01:30:00        93         9
5    98.6    NA   2015-01-01 02:00:00         9        91