Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/75.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
R 国际单项体育联合会声明和日期_R_Date_If Statement - Fatal编程技术网

R 国际单项体育联合会声明和日期

R 国际单项体育联合会声明和日期,r,date,if-statement,R,Date,If Statement,我试图实现的是分配一个新列,其中包含一个随时间变化的变量。 这只是其中的一个正在改变,所以我想做的是在日期之后,如果是22,则改为40 我目前有一段代码不能正常工作 Idea: if(lst$taskDate <= as.Date("2018-11-18")){ t2$Budget <- case_when( t2$taskStaffName == "L" ~ 20, t2$taskStaffName == "J" ~ 22,

我试图实现的是分配一个新列,其中包含一个随时间变化的变量。 这只是其中的一个正在改变,所以我想做的是在日期之后,如果是22,则改为40

我目前有一段代码不能正常工作

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
我由此推断,对于每个taskStaffName,您将有不同的前后费率,因此最好重新思考如何解决此问题。不要在任何时候或更糟的情况下使用case_,如果else包含名称和日期的所有组合,请合并到before/after rates的框架中,并使用适当的字段

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

正如Gregor提到的,我只是用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
)

谢谢大家抽出时间来解决我的问题

我不明白你为什么要把if和case\u结合起来。为什么不只做一个例子呢:case\u whent2$taskStaffName==L~20,t2$taskStaffName==J&lst$taskDate谢谢你让我知道我的错误。仍然在学习,这只是我脑海中浮现的想法,我很欣赏任何建设性的批评,这是学习R的过程。不过谢谢。如果你能给我更多的细节,我会很感激的。我想我已经很详细了。我只是没有在代码前面写lst$Budget=。这里有一个小小的添加:lst$Budget=case_whent2$taskStaffName==L~20,t2$taskStaffName==J&lst$taskDate代码运行。然而,我们正在做的是,在那个日期之后,将所有预算改为40,而不是我需要的J。你知道我怎么解决这个问题吗?真的~。。。确定不满足上述条件时发生的情况。我刚从你的代码中复制了TRUE~40-我想这就是你想要的。如果你想在这种情况下不修改预算数字,请执行TRUE~lst$budget。有许多名称一个接一个都是浪费时间的,你有没有办法只更改L 20 J 40和其他40?你需要更具体一些。听起来你只有一个特例,L=20,其他的都是40,但我不确定把这个加在你原来的问题上。所以,L是20,J是20,其余的都是40。但在那一天之后,J变为40,其余的继续留在这里,因为他们渴望得到你的帮助!我用下面的代码完成了。不过,我感谢你的时间!
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
)