R - 比较列并动态使用列中的结果值

R - Comparing columns and using the resulting value from the column dynamically

我想比较列,然后根据较小的列替换其中一个变量。

这是一个例子:

示例数据框:

#sample dataframe
data_example <- data.frame(var_a = c(1:10), var_b = c(6:9, NA, 1:5), var_c = c(NA, NA, 1:7, NA), var_d = c(1:10), var_e = c(1:5, 6:10))

   var_a var_b var_c var_d var_e
1      1     6    NA     1     1
2      2     7    NA     2     2
3      3     8     1     3     3
4      4     9     2     4     4
5      5    NA     3     5     5
6      6     1     4     6     6
7      7     2     5     7     7
8      8     3     6     8     8
9      9     4     7     9     9
10    10     5    NA    10    10

期望的输出:

#desired output
data_example <- data.frame(var_a = c(6,7,1,2,3,1,2,3,4,5), var_b = c(6:9, NA, 1:5), var_c = c(NA, NA, 1:7, NA), var_d = c(1:10), var_e = c(1:5, 6:10))

   var_a var_b var_c var_d var_e
1      6     6    NA     1     1
2      7     7    NA     2     2
3      1     8     1     3     3
4      2     9     2     4     4
5      3    NA     3     5     5
6      1     1     4     6     6
7      2     2     5     7     7
8      3     3     6     8     8
9      4     4     7     9     9
10     5     5    NA    10    10

为此我尝试了两种方法:

方法一:

data_example <- data_example %>% 
  mutate_at(var_a = case_when(   
    var_b < var_c | var_c == NA_real_ ~ var_b,   
    var_c < var_b | var_b == NA_real_ ~ var_c
  ))

报错:

Error in check_dot_cols(.vars, .cols) : 
  argument ".vars" is missing, with no default

方法二:

data_example$var_a <- case_when(   
  data_example$var_b < data_example$var_c | data_example$var_c == NA_real_ ~ data_example$var_b,   
  data_example$var_c < data_example$var_b | data_example$var_b == NA_real_ ~ data_example$var_c
)

   var_a var_b var_c var_d var_e
1     NA     6    NA     1     1
2     NA     7    NA     2     2
3      1     8     1     3     3
4      2     9     2     4     4
5     NA    NA     3     5     5
6      1     1     4     6     6
7      2     2     5     7     7
8      3     3     6     8     8
9      4     4     7     9     9
10    NA     5    NA    10    10

当这些列中有 NA 时,代码从 var_cvar_b 中产生 NA,而不是从 var_b 中输入值或 var_c.

如果有使用 dplyrpurrr 软件包的解决方案,那就太好了。

谢谢

使用评论中的建议...

data_example %>% mutate(
  var_a = pmin(var_b, var_c, na.rm = TRUE))

##   var_a var_b var_c var_d var_e
##1      6     6    NA     1     1
##2      7     7    NA     2     2
##3      1     8     1     3     3
##4      2     9     2     4     4
##5      3    NA     3     5     5
##6      1     1     4     6     6
##7      2     2     5     7     7
##8      3     3     6     8     8
##9      4     4     7     9     9
##10     5     5    NA    10    10