Если заявления и даты - PullRequest
0 голосов
/ 19 ноября 2018

То, что я пытаюсь достичь, - это выделить новый столбец с переменной, которая меняется со временем.Это только один из них, который меняется, поэтому я хотел бы, чтобы после (дата) вместо 40 было указано 22 * ​​1001 *

. У меня есть этот код, который не работает должным образом

Idea:
    if(lst$taskDate <= as.Date("2018-11-18")){
    t2$Budget <- case_when(
        t2$taskStaffName == "L" ~ 20,
        t2$taskStaffName == "J" ~ 22,
        TRUE ~ 40
    )
    }else{
        if(lst$taskDate >= as.Date("2018-11-19"))
    t2$Budget <- case_when(
        t2$taskStaffName == "L" ~ 20,
        t2$taskStaffName == "J" ~ 40,
                TRUE ~ 40

    )
        }


This is the Data Sample:

# A tibble: 3,692 x 4
   taskStaffName taskDate   taskMinutes taskBillable
   <chr>         <date>     <chr>       <chr>       
 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        
# ... with 3,682 more rows



Desired Outcome:

# A tibble: 3,692 x 5
   taskStaffName taskDate   taskMinutes taskBillable Budget
   <chr>         <date>     <chr>       <chr>         <dbl>
 1 J             2018-07-02 300         true             22
 2 J             2018-07-02 180         true             22
 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 L             2018-07-03 480         true             20
 8 L             2018-07-03 30          true             20
 9 J             2018-11-19 180         true             40
10 J             2018-11-19 30          true             40
# ... with 3,682 more rows

Ответы [ 2 ]

0 голосов
/ 20 ноября 2018

Как уже упоминал Грегор, я использовал case_when для этой проблемы.

В итоге я использую этот код:

lst2$Budget <- case_when(
    lst$taskStaffName == "L"  ~ 20,
    lst$taskStaffName == "J" & lst$taskDate <= as.Date("2018-11-18") ~ 22,
    lst$taskStaffName == "J" & lst$taskDate > as.Date("2018-11-18") ~ 40,
    TRUE ~ 40
)

спасибо всем, что нашли время и попытались решитьмой вопрос!

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

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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...