dplyr::mutate_at 在函数中迭代遍历列

4
require(dplyr)
df <- data.frame(Date.time = c("2015-01-01 00:00:00", "2015-01-01 00:30:00", "2015-01-01 01:00:00", "2015-01-01 01:30:00", "2015-01-01 02:00:00"),
           RH33HMP = c(99.6,99.6,99.5,99.3,98.63),
           RH33HMP_f = c(9,9,92,93,9),
           RH38HMP = c(99.6,99.6,99.5,99.3,98.63),
           RH38HMP_f = c(9,902,9,9,91))

这里有一些示例数据框。我想把每个特征列中,对应质量列(_f)中不是9的值都设为NA。首先,我使用grep找到实际测量的列号:
col_var <- grep("^Date.|_f$", names(df), invert = T)

然后我使用dplyrmutate_at函数,加上if_else条件语句。我的问题是,虽然mutate_at在所有col_val列中迭代,但函数本身并不迭代。我尝试了一些在stackoverflow上找到的示例,但似乎没有一个能够解决我的问题。

# 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)))

我认为我已经很接近了,需要任何帮助。

2个回答

1
我们可以使用 Map

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

如果你更喜欢使用 tidyverse,那么你可以使用 purrr 中的 map2

df[col_var] <- purrr::map2(df[col_var + 1],df[col_var], ~{.y[.x != 9] <- NA;.y})

1

一个使用 dplyrpurrr 的选项可能是:

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

非常感谢您的努力。我接受了其他答案,因为我想保持质量标志始终在实际测量值的下一列的想法。您的答案需要明确命名测量列,而我有几个不同名称的仪器,列出所有这些名称需要一段时间。 - Felix Phl

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接