R语言,算一个月的星期五

时间:2014-02-09 18:17:27

标签: r date if-statement

我有一个名为 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)

任何想法都将受到赞赏。

P.S .: 首先感谢快速支持,但也许我没有正确解释。 我的目标是在我的data.frame中获取另一个名为 Count_Friday 的列,该列精确定位该月份的星期五。 每次在一个月内找到 Flag_Friday == 1时,变量 Count_Friday 的值会增加。 当 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

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

3 个答案:

答案 0 :(得分: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)

答案 1 :(得分:1)

完全矢量化的方式:

> 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

答案 2 :(得分:0)

我认为你相对接近,但有一些事情是关闭的。首先,您使用&&代替&。只有后者是矢量化的(你使用前者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")
)