我有一个名为 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
再次感谢您的支持,并希望现在能够更清楚。
答案 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")
)