Как я могу создать столбец, который является результатом применения кусочной функции к другому столбцу? - PullRequest
0 голосов
/ 06 февраля 2019

Вот короткий пример, который я буду использовать, чтобы сформулировать мою проблему:

river_tibble <- tibble(
  river_name = c("River 1", "River 2", "River 3", "River 4", "River 5"),
  river_width_1 = c(418, 1264, 744, 3403, 2089)
)

Я имею в виду кусочную функцию.Например, я хотел бы добавить новый столбец в мою таблицу (я полагаю, используя mutate вариант?), Который является результатом функции, которая отображает river_width_1 значения в river_width_2 значения следующим образом:

river_width_1 == 0 -> 0,
0 < river_width_1 < 500 -> 1,
500 <= river_width_1 < 1000 -> 2,
100 <= river_width_1 < 2000 -> 3,
200 <= river_width_1 -> 4

Таким образом, конечный результат этого примера будет выглядеть так:

river_tibble <- tibble(
  river_name = c("River 1", "River 2", "River 3", "River 4", "River 5"),
  river_width_1 = c(418, 1264, 744, 3403, 2089),
  river_width_2 = c(1, 3, 2, 4, 4)
)

Есть ли способ построить river_width_2 с этим набором условных выражений, используя dplyr?

1 Ответ

0 голосов
/ 06 февраля 2019

Мы могли бы использовать cut

library(dplyr)

river_tibble %>% 
   mutate(river_width_2 = as.integer(cut(river_width_1, c(-Inf, 500, 1000, 2000, Inf))))

# river_name  river_width_1 river_width_2
#  <chr>              <dbl>         <int>
#1 River 1              418             1
#2 River 2             1264             3
#3 River 3              744             2
#4 River 4             3403             4
#5 River 5             2089             4

Или с case_when

river_tibble %>%
  mutate(river_width_2 = case_when(river_width_1 == 0 ~ 0 , 
                                   river_width_1 > 0 & river_width_1 < 500 ~ 1, 
                                   river_width_1 > 500 & river_width_1 < 1000 ~ 2, 
                                   river_width_1 > 1000 & river_width_1 < 2000 ~ 3, 
                                   TRUE ~ 4))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...