I have a blank data frame 'DF1' that looks like this:
| Site | 2021-01-01 00:00:00 | 2021-01-01 03:00:00 | 2021-01-01 06:00:00 | 2021-01-01 09:00:00 |
|---|---|---|---|---|
| BMA | NA | NA | NA | NA |
| BMC | NA | NA | NA | NA |
| MCA | NA | NA | NA | NA |
| MCC | NA | NA | NA | NA |
I have a section data frame 'DF2' that looks like this:
| ImageDate | SiteName |
|---|---|
| 2021-01-01 02:53:00 | BMA |
| 2021-01-01 08:44:00 | MCC |
| 2021-01-01 05:22:00 | BMC |
How can I query DF2 so that when a data point in 'ImageDate' falls into one of the column headers (time slots) of DF1 a number '1' is placed in the corresponding/matching 'Site' of DF1? And if no data is found in a particular column (time slot) for a site, that cell gets a '0', so that it would yield the following data frame:
| Site | 2021-01-01 00:00:00 | 2021-01-01 03:00:00 | 2021-01-01 06:00:00 | 2021-01-01 09:00:00 |
|---|---|---|---|---|
| BMA | 1 | 0 | 0 | 0 |
| BMC | 0 | 1 | 0 | 0 |
| MCA | 0 | 0 | 0 | 0 |
| MCC | 0 | 0 | 1 | 0 |
Thank you!
CodePudding user response:
Instead of creating a blank df1 and filling it you can transform df2 in a way that it gives the structure that we want.
You can try -
library(dplyr)
library(tidyr)
library(lubridate)
df2 %>%
mutate(ImageDate = floor_date(ymd_hms(ImageDate), '3 hours')) %>%
pivot_wider(names_from = ImageDate, values_from = ImageDate,
values_fn = length,values_fill = 0)
