【发布时间】:2018-11-19 02:45:16
【问题描述】:
我想要实现的是分配一个带有随时间变化的变量的新列。 它只是其中一个正在改变,所以我想做的是在(日期)之后放置 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
【问题讨论】:
-
我不明白您为什么要尝试将
if与case_when结合起来。为什么不只做一个case_when:case_when(t2$taskStaffName == "L" ~ 20, t2$taskStaffName == "J" & lst$taskDate <= as.Date("2018-11-18") ~ 22, TRUE ~ 40)如果你真的想嵌套,将case_when嵌套在case_when中。或使用ifelse。if()没有向量化,如果你给它一整列,它只会检查顶行。 -
感谢您让我知道我的错误。仍在学习,这只是我想到的想法,我感谢任何建设性的批评,一直在学习 R。谢谢。如果你能给我更多关于如何完成这项工作的详细信息,我将不胜感激。
-
我想我写得很详细。我只是没有在我的代码前面写
lst$Budget =。这里有一点点补充:lst$Budget = case_when(t2$taskStaffName == "L" ~ 20, t2$taskStaffName == "J" & lst$taskDate <= as.Date("2018-11-18") ~ 22, TRUE ~ 40)据我所知应该这样做。如果您以复制/可粘贴的方式共享数据(例如,与dput())共享数据,我将对其进行测试。虽然现在我看到它,但我对您的数据感到困惑 - 您只显示一个输入数据框,但您使用t2和lst就好像你有两个数据框 - 我不知道哪个是哪个... -
代码有效。然而,正在做的是将该日期之后的所有预算更改为 40,而不是我需要的 J。你知道我该如何解决这个问题吗?
-
TRUE ~ ...确定在不满足上述条件时会发生什么。我刚刚从您的代码中复制了TRUE ~ 40- 我认为这就是您想要的。如果您希望在这种情况下不修改预算数字,请执行TRUE ~ lst$Budget。
标签: r date if-statement