我要实现的目标是分配一个新列,该列具有随时间变化的变量。 只是其中一个正在改变,所以我想做的是After(date)输入40而不是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
答案 0 :(得分:1)
我推断,您每个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
这很难假设一个有趣的截止日期。如果您计划使用多个月度的时间表费率,则应该重新考虑该问题,因为使用条件连接(例如范围连接,模糊连接)可能会更好。参考:
修改
如果您的逻辑永远不会比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
答案 1 :(得分:0)
正如Gregor所说,我只是在解决此问题时才使用case_when。
我使用以下代码结束它:
MATCH
(player:Player)-[:WEARS]->(armor:Armor)-[:PART_OF]->(dragonSet:ArmorSet),
(missing)-[:PART_OF]->(dragonSet)
WHERE NOT (player)-[:WEARS]->(missing:Armor)
WITH DISTINCT missing
MATCH (npc:Npc)-[:PROVIDES]->(quest:Quest)-[:REWARDS]->(missing)
WHERE NOT (:Monster)-[:RANDOM_DROPS]->(missing)
RETURN npc.name AS npcName, quest.name AS questName, missing.name AS missingArmorName;
感谢大家抽出时间来尝试解决我的问题!