R - Сравнение столбцов и динамическое использование полученного значения из столбца - PullRequest
0 голосов
/ 19 сентября 2018

Я хотел бы сравнить столбцы, и затем, в зависимости от того, что меньше, следует заменить одну из переменных.

Вот пример:

Пример кадра данных:

#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

Я попытался 2 подхода для этого:

Подход 1:

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

Подход 2:

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_c или var_b, когда в этих столбцах вместо NA вместо значения изvar_b или var_c.

Если есть решение с использованием пакетов dplyr или purrr, которое было бы замечательно.

Спасибо

1 Ответ

0 голосов
/ 19 сентября 2018

Использование предложений в комментариях ...

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
...