R 国际单项体育联合会声明和日期
我试图实现的是分配一个新列,其中包含一个随时间变化的变量。 这只是其中的一个正在改变,所以我想做的是在日期之后,如果是22,则改为40 我目前有一段代码不能正常工作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,
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
)