I выведите из этого, что у вас будут разные ставки до / после для каждого taskStaffName
, поэтому, возможно, было бы лучше переосмыслить подход к проблеме.Вместо того, чтобы делать case_when
(или хуже, ifelse
), включая каждую комбинацию имени и даты, объедините в кадре ставки до / после и используйте соответствующее поле.
x <- read.table(header=TRUE, stringsAsFactors=FALSE, text="
taskStaffName taskDate taskMinutes taskBillable
1 G 2018-07-02 300 true
2 G 2018-07-02 180 true
3 L 2018-07-02 300 true
4 L 2018-07-02 180 false
5 C 2018-07-02 360 false
6 C 2018-07-02 120 false
7 G 2018-07-03 480 true
8 L 2018-07-03 30 true
9 L 2018-07-03 180 true
10 L 2018-07-02 30 true ")
x$taskDate <- as.Date(x$taskDate)
library(dplyr)
# library(tibble)
taskRates <- tibble::tribble(
~taskStaffName, ~before, ~after
,"J" , 22, 40
,"L" , 20, 20
,"G" , 20, 41
,"C" , 40, 41
)
cutoffDate <- as.Date("2018-11-18")
x %>%
left_join(taskRates, by = "taskStaffName") %>%
mutate(Budget = if_else(taskDate <= cutoffDate, before, after)) %>%
select(-before, -after)
# taskStaffName taskDate taskMinutes taskBillable Budget
# 1 G 2018-07-02 300 true 20
# 2 G 2018-07-02 180 true 20
# 3 L 2018-07-02 300 true 20
# 4 L 2018-07-02 180 false 20
# 5 C 2018-07-02 360 false 40
# 6 C 2018-07-02 120 false 40
# 7 G 2018-07-03 480 true 20
# 8 L 2018-07-03 30 true 20
# 9 L 2018-07-03 180 true 20
# 10 L 2018-07-02 30 true 20
Это труднопредполагает одну интересную дату отсечения.Если вы планируете иметь многомесячный график ставок, то эту проблему, вероятно, следует пересмотреть, поскольку вам может быть лучше с условным соединением (например, Range-Join, Fuzzy-Join).Ссылки:
Редактировать
Если ваша логика никогда не будет более сложной, чем 1 пользователь, изменяющий дату, то вы можете использовать логику case_when
, как @Gregor ранее рекомендовано:
x %>%
mutate(
Budget = case_when(
taskStaffName == "L" ~ 20,
taskStaffName == "J" &
taskDate <= cutoffDate ~ 20,
TRUE ~ 40
)
)
# taskStaffName taskDate taskMinutes taskBillable Budget
# 1 G 2018-07-02 300 true 40
# 2 G 2018-07-02 180 true 40
# 3 L 2018-07-02 300 true 20
# 4 L 2018-07-02 180 false 20
# 5 C 2018-07-02 360 false 40
# 6 C 2018-07-02 120 false 40
# 7 G 2018-07-03 480 true 40
# 8 L 2018-07-03 30 true 20
# 9 L 2018-07-03 180 true 20
# 10 L 2018-07-02 30 true 20