laelbrla
laelbrla

Reputation: 1

Nested variable by date and subject - EMA dataset

I have created the RespNum & RespDay variables using the code below (see starting at ______________________)

Now I just need to do the following task: Create a variable called ‘Day’ that is nested by subject and date

Data sample: (click here to download)

ParticipantId DateTime_local      RespNum RespDay
 <chr>         <dttm>                <int>   <int>
1 1001    2017-10-20 18:42:00       1       1
2 1001    2017-10-20 20:24:00       2       2
3 1001    2017-10-20 23:12:00       3       3
4 1001    2017-10-21 01:23:00       4       1
5 1001    2017-10-21 13:32:00       5       2
6 1001    2017-10-21 15:17:00       6       3
7 1001    2017-10-21 17:32:00       7       4
8 1001    2017-10-21 20:23:00       8       5
9 1001    2017-10-21 22:57:00       9       6
10 1001    2017-10-22 01:54:00      10       1

___________ Code used to create RespNum & RespDay ______________________

data = dataset

create new variable in correct time zone

data <- data %>%
mutate(DateTime = mdy_hm(DateTime),
       DateTime_local = force_tz(DateTime, tzone = "America/New_York"))

create RespNum

this variable is the number of responses by subject.

data <- data %>%
group_by(ParticipantId) %>%
mutate(RespNum = row_number(DateTime_local)) %>%
ungroup() %>%
arrange(ParticipantId, RespNum, DateTime_local) # arrange data

data %>% select(ParticipantId, DateTime_local, RespNum) #view data

split date & time into two columns

data$date <- sapply(strsplit(as.character(data$DateTime_local), " "), "[", 1)
data$time <- sapply(strsplit(as.character(data$DateTime_local), " "), "[", 2)

change date to date format and save as numeric date

(data$date <- ymd(data$date)) #change to date format
class(data$date) #check that it is stored as date
as.numeric(data$date) #save date as numeric
class(data$date) #check that it is still date

Create RespDay Variable

ID = grouping variable

data$ID <- data$ParticipantId

date = date (not date + time)

create variable that contains subject ID and date

data$ID_DAY<-paste(data$ID,as.numeric(data$date),sep="") 

data <- data %>% 
group_by(ID_DAY) %>%
mutate(RespDay = row_number(date)) %>%
ungroup() %>%
arrange(ParticipantId, RespNum, RespDay, DateTime_local) # arrange data

data %>% select(ParticipantId, DateTime_local, RespNum, RespDay) #view data

The ‘Day’ variable should be a series of 1’s for the first day the participant responded, series of 2 for the 2nd day the participant responded, etc.

So using the subset of data example above: ParticipantId DateTime_local RespNum RespDay Day

 <chr>         <dttm>                <int>   <int>          <int>   
1 1001    2017-10-20 18:42:00       1       1       1
2 1001    2017-10-20 20:24:00       2       2       1
3 1001    2017-10-20 23:12:00       3       3       1
4 1001    2017-10-21 01:23:00       4       1       2
5 1001    2017-10-21 13:32:00       5       2       2
6 1001    2017-10-21 15:17:00       6       3       2
7 1001    2017-10-21 17:32:00       7       4       2   
8 1001    2017-10-21 20:23:00       8       5       2
9 1001    2017-10-21 22:57:00       9       6       2       
10 1001    2017-10-22 01:54:00      10       1  3

Thank you!

Upvotes: 0

Views: 133

Answers (1)

laelbrla
laelbrla

Reputation: 1

Using the tidyverse and lubridate package, this works!

library(tidyverse)
library(lubridate)

##data = data name
## ParticipantId = unique subject ID
## expday = new variable created

data <- data %>% 
  group_by(ParticipantId) %>%
  mutate(
    DateTime = mdy_hm(DateTime),
    Date = lubridate::date(DateTime),
    expday = dense_rank(Date))
    ungroup() %>%
arrange(ParticipantId, DateTime, expday) # arrange data
data %>% select(ParticipantId, DateTime, expday) #view data

Upvotes: 0

Related Questions