Discussion:
[R] Count number of Fridays
jim holtman
2014-10-10 15:32:32 UTC
Permalink
require(lubridate)
now <- as.Date('2014-10-10') # some date
# get first of month
first_mon <- now - day(now) + 1
# create sequence of days in the month so you can count Fridays
x <- seq(first_mon, by = '1 day', length = days_in_month(first_mon))
first_fri <- sum(wday(x) == 6) # count fridays
# first of previous month
prev_mon <- first_mon - day(first_mon - 1)
# create sequence of days in month
x <- seq(prev_mon, by = '1 day', length = days_in_month(prev_mon))
prev_fri <- sum(wday(x) == 6)
cat('Fri this month:', first_fri, 'Fri last month:', prev_fri, '\n')
Fri this month: 5 Fri last month: 4
sign(first_fri - prev_fri) # will do the 'ifelse'-type test you want
[1] 1
Jim Holtman
Data Munger Guru

What is the problem that you are trying to solve?
Tell me what you want to do, not how you want to do it.
Hi Jim,
Thanks for your previous solution. I am learning to work with dates now.
I want to write a function which will
1. Count the number of fridays in the current month ( to extract month from
given date) and also the number of fridays in the preceeding month
2. Calculate the ratio of the number of fridays in current month to the
number of fridays in the precceding month
3. Return a integer value calculated as
ifelse(ratio>1,1,ifesle(ration<1,-1),0)
The date which is passed is in the format '31-may-2014'
So, given the date '31-may-2014'
Number of fridays in May2014 = 5
Number of fridays in Apr2014 = 4
Ratio = 5/4 >1
Hence, the function will return a value 1
I want to call the function by passing '31-may-2014' as an argument
How can this be done in R?
Any help will be appreciated
Thanks and regards,
Abhinaba
require(data.table)
x <- read.table(text = "CASE_ID YEAR_MTH ATT_1
+ CB26A 201302 1
+ CB26A 201302 0
+ CB26A 201302 0
+ CB26A 201303 1
+ CB26A 201303 1
+ CB26A 201304 0
+ CB26A 201305 1
+ CB26A 201305 0
+ CB26A 201306 1
+ CB27A 201304 0
+ CB27A 201304 0
+ CB27A 201305 1
+ CB27A 201306 1
+ CB27A 201306 0
+ CB27A 201307 0
+ CB27A 201308 1", header = TRUE, as.is = TRUE)
setDT(x)
# convert to a Date object for comparison
x[, MYD := as.Date(paste0(YEAR_MTH, '01'), format = "%Y%m%d")]
# separate by CASE_ID and only keep the first 3 months
x[
+ , {
+ # determine the end date as 3 months from the first date
+ endDate <- seq(MYD[1L], by = '3 months', length = 2)[2L]
+ # now count the changes
+ list(nChanges = length(rle(ATT_1[(MYD >= MYD[1L]) & (MYD <=
endDate)])[[1L]]) - 1L)
+ }
+ , by = CASE_ID
+ ]
CASE_ID nChanges
1: CB26A 5
2: CB27A 2
Jim Holtman
Data Munger Guru
What is the problem that you are trying to solve?
Tell me what you want to do, not how you want to do it.
On Mon, Aug 4, 2014 at 11:39 AM, Bert Gunter <gunter.berton at gene.com>
Or ?rle
Bert
Sent from my iPhone -- please excuse typos.
Try this, but I only get 2 changes for CB27A instead of you indicated
require(data.table)
x <- read.table(text = "CASE_ID YEAR_MTH ATT_1
+ CB26A 201302 1
+ CB26A 201302 0
+ CB26A 201302 0
+ CB26A 201303 1
+ CB26A 201303 1
+ CB26A 201304 0
+ CB26A 201305 1
+ CB26A 201305 0
+ CB26A 201306 1
+ CB27A 201304 0
+ CB27A 201304 0
+ CB27A 201305 1
+ CB27A 201306 1
+ CB27A 201306 0
+ CB27A 201307 0
+ CB27A 201308 1", header = TRUE, as.is = TRUE)
setDT(x)
# convert to a Date object for comparison
x[, MYD := as.Date(paste0(YEAR_MTH, '01'), format = "%Y%m%d")]
# separate by CASE_ID and only keep the first 3 months
x[
+ , {
+ # determine the end date as 3 months from the first date
+ endDate <- seq(MYD[1L], by = '3 months', length = 2)[2L]
+ # extract what is changing
+ changes <- ATT_1[(MYD >= MYD[1L]) & (MYD <= endDate)]
+ # now count the changes
+ list(nChanges = sum(head(changes, -1L) != tail(changes,
-1L)))
+ }
+ , by = CASE_ID
+ ]
CASE_ID nChanges
1: CB26A 5
2: CB27A 2
Jim Holtman
Data Munger Guru
What is the problem that you are trying to solve?
Tell me what you want to do, not how you want to do it.
On Wed, Jul 30, 2014 at 3:08 AM, Abhinaba Roy
Dear R-helpers,
I want to count the number of times ATT_1 has changed in a period of 3
months(can be 4months) from the first YEAR_MTH entry for a CASE_ID. So
if
for a CASE_ID we have data only for two distinct YEAR_MTH, then all
the
entries should be considered, otherwise only the relevant entries will
be
considered for calculation.
E.g. if the first YEAR_MTH entry is 201304 then get the number of
changes
till 201307(inclusive), similarly if the first YEAR_MTH entry is
201302
then get the number of changes till 201305.
Dataset
CASE_ID YEAR_MTH ATT_1
CB26A 201302 1
CB26A 201302 0
CB26A 201302 0
CB26A 201303 1
CB26A 201303 1
CB26A 201304 0
CB26A 201305 1
CB26A 201305 0
CB26A 201306 1
CB27A 201304 0
CB27A 201304 0
CB27A 201305 1
CB27A 201306 1
CB27A 201306 0
CB27A 201307 0
CB27A 201308 1
The final dataset should look like
ID_CASE No.of changes
CB26A 5
CB27A 3
where 'No.of changes' refer to the change in 3 months (201302-201305
for
CB26A and 201304-201307 for CB27A).
How can this be done in R?
Regards,
Abhinaba Roy
[[alternative HTML version deleted]]
______________________________________________
R-help at r-project.org mailing list
https://stat.ethz.ch/mailman/listinfo/r-help
PLEASE do read the posting guide
http://www.R-project.org/posting-guide.html
and provide commented, minimal, self-contained, reproducible code.
______________________________________________
R-help at r-project.org mailing list
https://stat.ethz.ch/mailman/listinfo/r-help
PLEASE do read the posting guide
http://www.R-project.org/posting-guide.html
and provide commented, minimal, self-contained, reproducible code.
Abhinaba Roy
2014-10-11 06:06:15 UTC
Permalink
Thanks Jim :)

Regards
Abhinaba
Post by jim holtman
require(lubridate)
now <- as.Date('2014-10-10') # some date
# get first of month
first_mon <- now - day(now) + 1
# create sequence of days in the month so you can count Fridays
x <- seq(first_mon, by = '1 day', length = days_in_month(first_mon))
first_fri <- sum(wday(x) == 6) # count fridays
# first of previous month
prev_mon <- first_mon - day(first_mon - 1)
# create sequence of days in month
x <- seq(prev_mon, by = '1 day', length = days_in_month(prev_mon))
prev_fri <- sum(wday(x) == 6)
cat('Fri this month:', first_fri, 'Fri last month:', prev_fri, '\n')
Fri this month: 5 Fri last month: 4
sign(first_fri - prev_fri) # will do the 'ifelse'-type test you want
[1] 1
Jim Holtman
Data Munger Guru
What is the problem that you are trying to solve?
Tell me what you want to do, not how you want to do it.
Hi Jim,
Thanks for your previous solution. I am learning to work with dates now.
I want to write a function which will
1. Count the number of fridays in the current month ( to extract month
from
given date) and also the number of fridays in the preceeding month
2. Calculate the ratio of the number of fridays in current month to the
number of fridays in the precceding month
3. Return a integer value calculated as
ifelse(ratio>1,1,ifesle(ration<1,-1),0)
The date which is passed is in the format '31-may-2014'
So, given the date '31-may-2014'
Number of fridays in May2014 = 5
Number of fridays in Apr2014 = 4
Ratio = 5/4 >1
Hence, the function will return a value 1
I want to call the function by passing '31-may-2014' as an argument
How can this be done in R?
Any help will be appreciated
Thanks and regards,
Abhinaba
require(data.table)
x <- read.table(text = "CASE_ID YEAR_MTH ATT_1
+ CB26A 201302 1
+ CB26A 201302 0
+ CB26A 201302 0
+ CB26A 201303 1
+ CB26A 201303 1
+ CB26A 201304 0
+ CB26A 201305 1
+ CB26A 201305 0
+ CB26A 201306 1
+ CB27A 201304 0
+ CB27A 201304 0
+ CB27A 201305 1
+ CB27A 201306 1
+ CB27A 201306 0
+ CB27A 201307 0
+ CB27A 201308 1", header = TRUE, as.is = TRUE)
setDT(x)
# convert to a Date object for comparison
x[, MYD := as.Date(paste0(YEAR_MTH, '01'), format = "%Y%m%d")]
# separate by CASE_ID and only keep the first 3 months
x[
+ , {
+ # determine the end date as 3 months from the first date
+ endDate <- seq(MYD[1L], by = '3 months', length = 2)[2L]
+ # now count the changes
+ list(nChanges = length(rle(ATT_1[(MYD >= MYD[1L]) & (MYD <=
endDate)])[[1L]]) - 1L)
+ }
+ , by = CASE_ID
+ ]
CASE_ID nChanges
1: CB26A 5
2: CB27A 2
Jim Holtman
Data Munger Guru
What is the problem that you are trying to solve?
Tell me what you want to do, not how you want to do it.
On Mon, Aug 4, 2014 at 11:39 AM, Bert Gunter <gunter.berton at gene.com>
Or ?rle
Bert
Sent from my iPhone -- please excuse typos.
Try this, but I only get 2 changes for CB27A instead of you indicated
require(data.table)
x <- read.table(text = "CASE_ID YEAR_MTH ATT_1
+ CB26A 201302 1
+ CB26A 201302 0
+ CB26A 201302 0
+ CB26A 201303 1
+ CB26A 201303 1
+ CB26A 201304 0
+ CB26A 201305 1
+ CB26A 201305 0
+ CB26A 201306 1
+ CB27A 201304 0
+ CB27A 201304 0
+ CB27A 201305 1
+ CB27A 201306 1
+ CB27A 201306 0
+ CB27A 201307 0
+ CB27A 201308 1", header = TRUE, as.is = TRUE)
setDT(x)
# convert to a Date object for comparison
x[, MYD := as.Date(paste0(YEAR_MTH, '01'), format = "%Y%m%d")]
# separate by CASE_ID and only keep the first 3 months
x[
+ , {
+ # determine the end date as 3 months from the first date
+ endDate <- seq(MYD[1L], by = '3 months', length = 2)[2L]
+ # extract what is changing
+ changes <- ATT_1[(MYD >= MYD[1L]) & (MYD <= endDate)]
+ # now count the changes
+ list(nChanges = sum(head(changes, -1L) != tail(changes,
-1L)))
+ }
+ , by = CASE_ID
+ ]
CASE_ID nChanges
1: CB26A 5
2: CB27A 2
Jim Holtman
Data Munger Guru
What is the problem that you are trying to solve?
Tell me what you want to do, not how you want to do it.
On Wed, Jul 30, 2014 at 3:08 AM, Abhinaba Roy
Dear R-helpers,
I want to count the number of times ATT_1 has changed in a period
of 3
months(can be 4months) from the first YEAR_MTH entry for a CASE_ID.
So
if
for a CASE_ID we have data only for two distinct YEAR_MTH, then all
the
entries should be considered, otherwise only the relevant entries
will
be
considered for calculation.
E.g. if the first YEAR_MTH entry is 201304 then get the number of
changes
till 201307(inclusive), similarly if the first YEAR_MTH entry is
201302
then get the number of changes till 201305.
Dataset
CASE_ID YEAR_MTH ATT_1
CB26A 201302 1
CB26A 201302 0
CB26A 201302 0
CB26A 201303 1
CB26A 201303 1
CB26A 201304 0
CB26A 201305 1
CB26A 201305 0
CB26A 201306 1
CB27A 201304 0
CB27A 201304 0
CB27A 201305 1
CB27A 201306 1
CB27A 201306 0
CB27A 201307 0
CB27A 201308 1
The final dataset should look like
ID_CASE No.of changes
CB26A 5
CB27A 3
where 'No.of changes' refer to the change in 3 months (201302-201305
for
CB26A and 201304-201307 for CB27A).
How can this be done in R?
Regards,
Abhinaba Roy
[[alternative HTML version deleted]]
______________________________________________
R-help at r-project.org mailing list
https://stat.ethz.ch/mailman/listinfo/r-help
PLEASE do read the posting guide
http://www.R-project.org/posting-guide.html
and provide commented, minimal, self-contained, reproducible code.
______________________________________________
R-help at r-project.org mailing list
https://stat.ethz.ch/mailman/listinfo/r-help
PLEASE do read the posting guide
http://www.R-project.org/posting-guide.html
and provide commented, minimal, self-contained, reproducible code.
[[alternative HTML version deleted]]

Continue reading on narkive:
Loading...