【问题标题】:Using Branching Statements on entire list rather than individual items in R在整个列表而不是 R 中的单个项目上使用分支语句
【发布时间】:2014-09-10 17:30:00
【问题描述】:

这是这个问题的后续,虽然这里的问题与那个问题无关,Using apply functions instead of for and branching statements in R

我有一个数据框:

    Date       Close    Weekday        DayOfMonth
290 1991-02-22 365.65   Friday         22
295 1991-03-01 370.47   Friday          1
300 1991-03-08 374.95   Friday          8
305 1991-03-15 373.59   Friday         15
310 1991-03-22 367.48   Friday         22
314 1991-03-28 375.22 Thursday         28
319 1991-04-05 375.36   Friday          5
324 1991-04-12 380.40   Friday         12
329 1991-04-19 384.20   Friday         19
334 1991-04-26 379.02   Friday         26
339 1991-05-03 380.80   Friday          3

我想创建另一个名为 WeekOfCycle 的列,它根据月份中的某天计算出给定日期在月份中的哪一周。我正在根据上述问题使用此功能。

as.integer(cut(data$DayOfMonth, c(-Inf, 7, 14, 21, 28, Inf)))

上面的行适合周五,周四应该是

as.integer(cut(data$DayOfMonth, c(-Inf, 6, 13, 20, 27, Inf)))

期望的输出:

          Date  Close  Weekday DayOfMonth WeekOfCycle
290 1991-02-22 365.65   Friday         22           4
295 1991-03-01 370.47   Friday          1           1
300 1991-03-08 374.95   Friday          8           2
305 1991-03-15 373.59   Friday         15           3
310 1991-03-22 367.48   Friday         22           4
314 1991-03-28 375.22 Thursday         28           5
319 1991-04-05 375.36   Friday          5           1
324 1991-04-12 380.40   Friday         12           2
329 1991-04-19 384.20   Friday         19           3
334 1991-04-26 379.02   Friday         26           4
339 1991-05-03 380.80   Friday          3           1

我试图让它与这个 lapply 函数一起工作,尽管它不起作用:

   data$WeekOfCycle <- with(data, lapply(Weekday, function(i){
                            if (i == "Friday"){
                               as.integer(cut(DayOfMonth, c(-Inf, 7, 14, 21, 28, Inf)))
                               }
                            else if (i == "Thursday"){
                              as.integer(cut(DayOfMonth, c(-Inf, 6, 13, 20, 27, Inf)))
                            }
                            }
                           ))

我觉得我很接近,但肯定错过了一些东西。理想情况下,即使没有 if 和 else 语句,我也想这样做,但我不知道该怎么做。

数据框的可重现代码:

structure(list(Date = structure(c(7722, 7729, 7736, 7743, 7750, 
7756, 7764, 7771, 7778, 7785, 7792), class = "Date"), Close = c(365.65, 
370.47, 374.95, 373.59, 367.48, 375.22, 375.36, 380.4, 384.2, 
379.02, 380.8), Weekday = c("Friday", "Friday", "Friday", "Friday", 
"Friday", "Thursday", "Friday", "Friday", "Friday", "Friday", 
"Friday"), DayOfMonth = c(22, 1, 8, 15, 22, 28, 5, 12, 19, 26, 
3)), .Names = c("Date", "Close", "Weekday", "DayOfMonth"), row.names = c(290L, 
295L, 300L, 305L, 310L, 314L, 319L, 324L, 329L, 334L, 339L), class = "data.frame")

感谢您的帮助。

【问题讨论】:

    标签: r if-statement dataframe


    【解决方案1】:

    如果您将所需的输出包含在您的示例数据中会有所帮助,这样我就可以检查我是否得到了您想要的结果,但是这个方法怎么样

    #define the shift for each week day
    offset<-c(Friday=0, Thursday=1)
    
    #see how may times 7 does into the date of month
    MonthWeek <- unname((data$DayOfMonth+offset[data$Weekday]-1) %/% 7 +1)
    
    cbind(data, MonthWeek)
    #           Date  Close  Weekday DayOfMonth MonthWeek
    # 290 1991-02-22 365.65   Friday         22         4
    # 295 1991-03-01 370.47   Friday          1         1
    # 300 1991-03-08 374.95   Friday          8         2
    # 305 1991-03-15 373.59   Friday         15         3
    # 310 1991-03-22 367.48   Friday         22         4
    # 314 1991-03-28 375.22 Thursday         28         5
    # 319 1991-04-05 375.36   Friday          5         1
    # 324 1991-04-12 380.40   Friday         12         2
    # 329 1991-04-19 384.20   Friday         19         3
    # 334 1991-04-26 379.02   Friday         26         4
    # 339 1991-05-03 380.80   Friday          3         1
    

    在这种特殊情况下,不需要复杂的if 语句。一切都可以通过一些非常简单的数学快速完成。

    【讨论】:

    • Flick 先生,我想你已经开始了。尽管我认为需要添加而不是减去偏移量。另外,我不确定是否需要减去 1。用英语,我想知道每个月的星期五,第 1、第 2、第 3、第 4 或第 5 日。如果数据点是星期四,我仍然对星期五感兴趣。例如,在上面的数据集中,有 Thurs, 3/28/91。那是本月的第四个星期四,但第二天是第五个星期五,这是我想要的数字 5。
    • Nicola,星期四不行。即使数据点是星期四,我也想知道它基于星期五是一个月中的哪一周。
    • @user2926358 我不明白。查看 1991 年比赛的日历,03-28 是第四个星期四。不是第五个
    • 是的,但是 3 月 29 日星期五是第五个星期五。即使在我拥有的每周数据点是星期四的情况下,这也是我想知道的。
    • @user2926358 如果没有 -1,我认为对于像 1993-05-07 这样的日期会失败。
    猜你喜欢
    • 1970-01-01
    • 2011-09-22
    • 2015-01-17
    • 1970-01-01
    • 2014-09-17
    • 1970-01-01
    • 2015-06-25
    • 2021-10-16
    • 2022-09-26
    相关资源
    最近更新 更多