【问题标题】:R language, count the Friday in a monthR语言,计算一个月中的星期五
【发布时间】:2014-03-06 22:38:24
【问题描述】:

我有一个名为 ll 的 data.frame,其中包含 2014 年到 2014 年之间的所有日期。 我还有一个名为 Flag_new_month 的列,如果它是新月份的第一天,则为 1,否则为 0。 最后,我有一个名为 Flag_Friday 的列,如果是星期五,则为 1,否则为 0

这是一个例子:

Dates           Month    Weekday     Flag_new_month  Flag_Friday
2014-01-30      1        Thursday    0               0  
2014-01-31      1        Friday      0               1  
2014-02-01      2        Saturday    1               0  

我的目标是获得一个月中所有星期五的计数器,当新月份发生时重置为零。 我尝试使用简单的 ifelse 语句来做到这一点,但没有成功:

count=0
ll$Count_Friday = ifelse(ll$Flag_Friday == 1 && ll$Flag_new_month == 0, count+1,0)

任何想法都会受到赞赏。

附: 首先感谢您的快速支持,但也许我没有正确解释。 我的目标是在我的 data.frame 中获取另一列名为 Count_Friday 的列,该列指出该月的星期五数。 变量 Count_Friday 的值在一个月内每次发现 Flag_Friday == 1 时都会增加。 当 Flag_new_month == 1 时,变量 Count_Friday 将重置为零。 例如:

Dates       Month   Weekday         Flag_new_month  Flag_Friday Count_Friday
2014-01-15  1       Wednesday       0               0           0
2014-01-16  1       Thursday        0               0           0
2014-01-17  1       Friday          0               1           1
2014-01-18  1       Saturday        0               0           0
2014-01-19  1       Sunday          0               0           0
2014-01-20  1       Monday          0               0           0
2014-01-21  1       Tuesday         0               0           0
2014-01-22  1       Wednesday       0               0           0
2014-01-23  1       Thursday        0               0           0
2014-01-24  1       Friday          0               1           2
2014-01-25  1       Saturday        0               0           0
2014-01-26  1       Sunday          0               0           0
2014-01-27  1       Monday          0               0           0
2014-01-28  1       Tuesday         0               0           0
2014-01-29  1       Wednesday       0               0           0
2014-01-30  1       Thursday        0               0           0
2014-01-31  1       Friday          0               1           3
2014-02-01  2       Saturday        1               0           0
2014-02-02  2       Sunday          0               0           0
2014-02-03  2       Monday          0               0           0
2014-02-04  2       Tuesday         0               0           0
2014-02-05  2       Wednesday       0               0           0
2014-02-06  2       Thursday        0               0           0
2014-02-07  2       Friday          0               1           1

再次感谢您的支持,希望现在更清楚。

【问题讨论】:

  • 首先感谢您的快速支持。

标签: r date if-statement


【解决方案1】:

您可以为此使用 plyr 包:

df <- read.table(header = TRUE, text = 'Dates           Month    Weekday     Flag_new_month  Flag_Friday
2014-01-30      1        Thursday    0               0  
2014-01-31      1        Friday      0               1  
2014-02-01      2        Saturday    1               0  
2014-02-07      2        Friday      1               1
2014-02-14      2        Friday      1               1')

head(df)
require(plyr)
ddply(df, .(Month), summarise,
      n_friday = sum(Flag_Friday))

或者只是tapply:

tapply(df$Flag_Friday, df$Month, sum)

【讨论】:

    【解决方案2】:

    一种完全矢量化的方式:

    > df<-data.frame(cbind(c(0,0,0,1,0,0,1,0,0,0), c(1,0,1,0,1,0,1,0,1,0)))
    > colnames(df)<-c('Month', 'Friday')
    > df
       Month Friday
    1      0      1
    2      0      0
    3      0      1
    4      1      0
    5      0      1
    6      0      0
    7      1      1
    8      0      0
    9      0      1
    10     0      0
    > cumsum(df$Friday)-cummax(ifelse(df$Month==1, c(0,cumsum(df$Friday)), 0))
    [1] 1 1 2 0 1 1 1 1 2 2
    

    【讨论】:

      【解决方案3】:

      我认为您比较接近,但有几件事不妥。首先,您使用的是&amp;&amp; 而不是&amp;。只有后者是矢量化的(您将前者与if/else 一起使用,而后者与ifelse 一起使用)。此外,第二个条件不起作用,因为Flag_new_month 在星期五并不总是 1。我相信这可以满足您的要求:

      ll$Count_Friday <- 
        with(ll, ifelse(Flag_Friday, ave(Flag_Friday, Month, FUN=cumsum), 0))
      

      如果您注意到我不使用Flag_new_month,而是使用ave 按月分解Flag_Friday 列,然后在每个月内,计算星期五的累积总和。 ifelse 只是为了让我只填充周五的累积总和值(否则周五之后到下周五的每一天都与Count_Friday 具有相同的数字)。

      结果如下。有趣的是,2014 年第一个月有 5 个星期五。

      head(ll, 40)
      #         Dates Month   Weekday Flag_new_month Flag_Friday Count_Friday
      # 1  2014-01-01     1 Wednesday              1           0            0
      # 2  2014-01-02     1  Thursday              0           0            0
      # 3  2014-01-03     1    Friday              0           1            1
      # 4  2014-01-04     1  Saturday              0           0            0
      # 5  2014-01-05     1    Sunday              0           0            0
      # 6  2014-01-06     1    Monday              0           0            0
      # 7  2014-01-07     1   Tuesday              0           0            0
      # 8  2014-01-08     1 Wednesday              0           0            0
      # 9  2014-01-09     1  Thursday              0           0            0
      # 10 2014-01-10     1    Friday              0           1            2
      # 11 2014-01-11     1  Saturday              0           0            0
      # 12 2014-01-12     1    Sunday              0           0            0
      # 13 2014-01-13     1    Monday              0           0            0
      # 14 2014-01-14     1   Tuesday              0           0            0
      # 15 2014-01-15     1 Wednesday              0           0            0
      # 16 2014-01-16     1  Thursday              0           0            0
      # 17 2014-01-17     1    Friday              0           1            3
      # 18 2014-01-18     1  Saturday              0           0            0
      # 19 2014-01-19     1    Sunday              0           0            0
      # 20 2014-01-20     1    Monday              0           0            0
      # 21 2014-01-21     1   Tuesday              0           0            0
      # 22 2014-01-22     1 Wednesday              0           0            0
      # 23 2014-01-23     1  Thursday              0           0            0
      # 24 2014-01-24     1    Friday              0           1            4
      # 25 2014-01-25     1  Saturday              0           0            0
      # 26 2014-01-26     1    Sunday              0           0            0
      # 27 2014-01-27     1    Monday              0           0            0
      # 28 2014-01-28     1   Tuesday              0           0            0
      # 29 2014-01-29     1 Wednesday              0           0            0
      # 30 2014-01-30     1  Thursday              0           0            0
      # 31 2014-01-31     1    Friday              0           1            5
      # 32 2014-02-01     2  Saturday              1           0            0
      # 33 2014-02-02     2    Sunday              0           0            0
      # 34 2014-02-03     2    Monday              0           0            0
      # 35 2014-02-04     2   Tuesday              0           0            0
      # 36 2014-02-05     2 Wednesday              0           0            0
      # 37 2014-02-06     2  Thursday              0           0            0
      # 38 2014-02-07     2    Friday              0           1            1
      # 39 2014-02-08     2  Saturday              0           0            0
      # 40 2014-02-09     2    Sunday              0           0            0    
      

      这是我制作数据的方式:

      ll <- data.frame(Dates=seq(as.Date("2014-01-01"), len=365, by="1 day"))
      ll <- transform(
        ll, 
        Month=month(Dates), 
        Weekday=weekdays(Dates),
        Flag_new_month=diff(c(0, month(Dates))),
        Flag_Friday=as.integer(weekdays(Dates) == "Friday")
      )
      

      【讨论】:

      • 是的,这正是我想要的。谢谢
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-03-21
      • 2020-09-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-09-25
      相关资源
      最近更新 更多