In R, I have a data frame with the columns id (representing study participants), phase, time, glucose, steps, and kiloCalories. id and phase are factors, time is POSIXcT and includes date + time, glucose (sampled every ~15 minutes) steps (sampled every minute), and kiloCalories (sampled irregularly, represents an eaten meal) are numeric. Glucose and kiloCalories data is much less frequently sampled than steps, so it contains lots of NAs.
I would like to filter this data frame in the following ways:
- Retrieve the rows with the first meal of the day of each participant (id), and their glucose reading 2 hours (+-15 minutes) before that meal.
- Retrieve the rows with each meal (i.e. each kiloCalories entry) of each participant (id), along with the glucose reading 2 hours (+-15 minutes) after the meal.
- From task 2, take the subset of data in between meal and glucose reading, and calculate the sum of steps within that time.
The reason I specify 2 hours (+-15 minutes) is because there is a very low probability that the data frame has a glucose reading exactly 2 hours after a meal is eaten, thus I want to extend the timeframe
I've tried this StackOverflow thread on how to subset based on time and condition, but to no avail, leaving me stuck at my first task. And that thread does not talk about the complex subsetting I'd like to perform.
Edit - Here is some sample data which meets the criteria of the tasks:
sampleData <- structure(list(id = c(13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
13, 13, 13, 13), phase = c(1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1), time = structure(c(1450881900,
1450881960, 1450882020, 1450882080, 1450882140, 1450882200, 1450882260,
1450882320, 1450882380, 1450882440, 1450882500, 1450882560, 1450882620,
1450882680, 1450882740, 1450882800, 1450882860, 1450882920, 1450882980,
1450883040, 1450883100, 1450883160, 1450883220, 1450883280, 1450883340,
1450883400, 1450883460, 1450883520, 1450883580, 1450883640, 1450883700,
1450883760, 1450883820, 1450883880, 1450883940, 1450884000, 1450884060,
1450884120, 1450884180, 1450884240, 1450884300, 1450884360, 1450884420,
1450884480, 1450884540, 1450884600, 1450884660, 1450884720, 1450884780,
1450884840, 1450884900, 1450884960, 1450885020, 1450885080, 1450885140,
1450885200, 1450885260, 1450885320, 1450885380, 1450885440, 1450885500,
1450885560, 1450885620, 1450885680, 1450885740, 1450885800, 1450885860,
1450885920, 1450885980, 1450886040, 1450886100, 1450886160, 1450886220,
1450886280, 1450886340, 1450886400, 1450886460, 1450886520, 1450886580,
1450886640, 1450886700, 1450886760, 1450886820, 1450886880, 1450886940,
1450887000, 1450887060, 1450887120, 1450887180, 1450887240, 1450887300,
1450887360, 1450887420, 1450887480, 1450887540, 1450887600, 1450887660,
1450887720, 1450887780, 1450887840, 1450887900, 1450887960, 1450888020,
1450888080, 1450888140, 1450888200, 1450888260, 1450888320, 1450888380,
1450888440, 1450888500, 1450888560, 1450888620, 1450888680, 1450888740,
1450888800, 1450888860, 1450888920, 1450888980, 1450889040, 1450889100,
1450889160, 1450889220, 1450889280, 1450889340, 1450889400, 1450889460,
1450889520, 1450889580, 1450889640, 1450889700, 1450889760, 1450889820,
1450889880, 1450889940, 1450890000, 1450890060, 1450890120, 1450890180,
1450890240, 1450890300, 1450890360, 1450890420, 1450890480, 1450890540,
1450890600, 1450890660, 1450890720, 1450890780, 1450890840, 1450890900,
1450890960, 1450891020, 1450891080, 1450891140, 1450891200, 1450891260,
1450891320, 1450891380, 1450891440, 1450891500, 1450891560, 1450891620,
1450891680, 1450891740, 1450891800, 1450891860, 1450891920, 1450891980,
1450892040, 1450892100, 1450892160, 1450892220, 1450892280, 1450892340,
1450892400, 1450892460, 1450892520, 1450892580, 1450892640, 1450892700,
1450892760, 1450892820, 1450892880, 1450892940, 1450893000, 1450893060,
1450893120, 1450893180, 1450893240, 1450893300, 1450893360, 1450893420,
1450893480, 1450893540, 1450893600, 1450893660, 1450893720, 1450893780,
1450893840, 1450893900, 1450893960, 1450894020, 1450894080, 1450894140,
1450894140, 1450894200, 1450894260, 1450894320, 1450894380, 1450894440,
1450894500, 1450894560, 1450894620, 1450894680, 1450894740, 1450894800,
1450894860, 1450894920, 1450894980, 1450895040, 1450895100, 1450895160,
1450895220, 1450895280, 1450895340, 1450895400, 1450895460, 1450895520,
1450895580, 1450895640, 1450895700, 1450895760, 1450895820, 1450895880,
1450895940, 1450896000, 1450896060, 1450896120, 1450896180, 1450896240,
1450896300, 1450896360, 1450896420, 1450896480, 1450896540, 1450896600,
1450896660, 1450896720, 1450896780, 1450896840, 1450896900, 1450896960,
1450897020, 1450897080, 1450897140, 1450897200, 1450897260, 1450897320,
1450897380, 1450897440, 1450897500, 1450897560, 1450897620, 1450897680,
1450897740, 1450897800, 1450897860, 1450897920, 1450897980, 1450898040,
1450898100, 1450898160, 1450898220, 1450898280, 1450898340, 1450898400,
1450898460, 1450898520, 1450898580, 1450898640, 1450898700, 1450898760,
1450898820, 1450898880, 1450898940, 1450899000, 1450899060, 1450899120,
1450899180, 1450899240, 1450899300, 1450899360, 1450899420, 1450899480,
1450899540, 1450899600, 1450899660, 1450899720, 1450899780, 1450899840,
1450899900), class = c("POSIXct", "POSIXt")), gl = c(NA, NA,
NA, NA, NA, NA, NA, NA, 84, NA, NA, NA, NA, 83, NA, NA, NA, NA,
NA, NA, NA, NA, NA, 81, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA,
NA, NA, NA, NA, 82, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA,
NA, NA, NA, 84, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA,
NA, NA, 83, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA,
NA, 79, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA,
76, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, 78,
NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, 93, NA,
NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, 116, NA,
NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, 128, NA,
NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, 141, NA,
NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, 142, NA,
NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, 146,
143, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA,
136, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA,
129, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA,
134, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA,
139, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA,
134, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA,
128, NA, NA, NA, NA, NA, NA), steps = c(24, 39, 28, 19, 29, 6,
12, 3, 13, 1, 6, 2, 1, 13, 10, 1, 1, 1, 1, 0, 0, 1, 1, 3, 1,
0, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 2, 1, 0, 3, 33, 27, 17, 27,
30, 19, 23, 34, 38, 25, 30, 42, 31, 31, 16, 52, 91, 39, 23, 7,
6, 27, 64, 20, 53, 22, 14, 14, 5, 4, 13, 7, 13, 7, 8, 10, 14,
26, 25, 19, 23, 35, 23, 15, 13, 12, 11, 27, 21, 25, 27, 4, 8,
18, 15, 22, 30, 16, 15, 15, 5, 3, 4, 6, 0, 12, 10, 4, 3, 5, 2,
5, 10, 13, 7, 2, 6, 2, 1, 15, 23, 25, 18, 27, 5, 11, 22, 31,
17, 27, 19, 2, 0, 12, 3, 0, 5, 5, 0, 0, 1, 0, 2, 2, 2, 5, 4,
4, 1, 7, 2, 5, 4, 8, 2, 4, 0, 4, 6, 8, 11, 10, 22, 2, 1, 0, 4,
4, 2, 2, 9, 19, 8, 11, 7, 7, 4, 0, 1, 0, 2, 3, 13, 9, 0, 3, 4,
5, 5, 7, 5, 5, 8, 8, 26, 23, 26, 27, 24, 24, 13, 25, 17, 24,
24, 11, 16, 15, 25, 21, 18, 11, 16, 19, 2, 0, 7, 6, 6, 3, 1,
13, 13, 0, 1, 10, 12, 10, 9, 7, 1, 1, 12, 4, 0, 0, 0, 5, 2, 5,
2, 1, 2, 0, 1, 2, 5, 11, 0, 0, 2, 1, 0, 2, 0, 7, 1, 0, 0, 0,
0, 1, 0, 3, 1, 0, 1, 0, 0, 3, 10, 13, 1, 8, 4, 1, 0, 0, 1, 0,
23, 22, 11, 16, 16, 5, 5, 5, 3, 14, 2, 0, 0, 0, 1, 2, 0, 1, 2,
3, 1), kiloCalories = c(NA, NA, NA, NA, NA, NA, NA, NA, NA, NA,
NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA,
NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA,
NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA,
NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA,
NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA,
NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA,
NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA,
NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, 603, NA,
NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA,
NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA,
NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA,
NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA,
NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA,
NA, NA, NA, NA, NA, NA, NA, NA, NA, 143, NA, NA, NA, NA, NA,
NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA,
NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA,
NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA,
NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA,
NA, NA, NA, NA, NA, NA)), row.names = c(NA, -302L), class = c("tbl_df",
"tbl", "data.frame"))