2014-02-09 55 views
2

我有一個名爲LL與所有2014年和2014年 同樣的日期data.frame我已如果這是第一個名爲Flag_new_month列是一個新月的日子和否則。 最後我有一列Flag_Friday這是如果是星期五和否則。R輸入語言,算上週五在一個月

下面是一個例子:

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的另一列,該列確定當月的星期五數。 變量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 

感謝,並希望現在更清楚。

+0

第一。 – GrilloRob

回答

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") 
) 
+0

是的,這正是我所尋找的。 謝謝 – GrilloRob

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

一個這樣做的完全量化的方式:

> 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 
相關問題