Строка min () справа при использовании dplyr :: case_when - PullRequest
0 голосов
/ 31 октября 2018

Я пытаюсь получить меньшую из одной переменной в одном наблюдении и фиксированного числа в условном выражении dplyr :: case_when в R. Но оператор min () сравнивается с наименьшим наблюдением всего вектора переменных, т.е. за каждое наблюдение.

library(tidyverse)
data_frame(spc = rep(c("cat", "dog"), 3), z = 1:6) %>%
   mutate(
    dogsmax3 = case_when(
      spc == "dog" ~ min(z, 3),
      TRUE ~ 0))
 #  spc       z dogsmax3
 #  <chr> <int>    <dbl>
 #1 cat       1        0
 #2 dog       2        1
 #3 cat       3        0
 #4 dog       4        1
 #5 cat       5        0
 #6 dog       6        1

Пока я ищу заявление, дающее такой результат:

 #  spc       z dogsmax3
 #  <chr> <int>    <dbl>
 #1 cat       1        0
 #2 dog       2        2
 #3 cat       3        0
 #4 dog       4        3
 #5 cat       5        0
 #6 dog       6        3

Итак, есть предложения по улучшению оценки?

Ответы [ 2 ]

0 голосов
/ 31 октября 2018

Вы можете использовать ?pmin вместо min -

data_frame(spc = rep(c("cat", "dog"), 3), z = 1:6) %>%
  mutate(
    dogsmax3 = case_when(
      spc == "dog" ~ pmin(z, 3),
      TRUE ~ 0)
  )

# A tibble: 6 x 3
  spc       z dogsmax3
  <chr> <int>    <dbl>
1 cat       1     0   
2 dog       2     2.00
3 cat       3     0   
4 dog       4     3.00
5 cat       5     0   
6 dog       6     3.00
0 голосов
/ 31 октября 2018

Используйте rowwise. Вместо case_when вы также можете использовать ifelse:

library(tidyverse)
data_frame(spc = rep(c("cat", "dog"), 3), z = 1:6) %>%
   rowwise() %>%
   mutate(dogsmax3 = ifelse(spc == "dog", min(z,3), 0)) %>%
   ungroup() ## to revert the grouping by rows
...