По общему признанию, я не совсем уверен, что вы имеете в виду, говоря "обрезание ненулевых значений y в квартили по дате", и, боюсь, у меня недостаточно репутации, чтобы спросить.
Если'date' - это столбец фактической даты, и вы имеете в виду, что 'новая переменная' quartile 'должна указывать, в какой части года y произошла, при условии, что y не равно 0, в этом случае это должно быть 0 ", я бысделать это так:
library(dplyr)
library(lubridate)
# create example
dt <- data.frame(y = c(0, 1, 3, 4), date = c("01-02-18", "01-06-18",
"01-12-16", "01-04-17"))
dt <- dt %>%
## change 'date' to an actual date
mutate(date = as_date(date)) %>%
## extract the quarter
mutate(quartile = quarter(date)) %>%
## replace all quarters with 0 where y was 0
mutate(quartile = if_else(y == 0, 0, as.double(quartile)))`
РЕДАКТИРОВАТЬ: Я думаю, что я понимаю проблему сейчас.Это, вероятно, немного многословно, но я думаю, что он делает то, что вы хотите:
library(dplyr)
dt <- tibble(y = c(20, 30, 40, 20, 30, 40, 0), date = c("01-02-16",
"01-02-16", "01-02-16", "01-08-18", "01-08-18", "01-08-18",
"01-08-18"))
new_dt <- dt %>%
# filter out all cases where y is greater than 0
filter(y > 0) %>%
# group by date
group_by(date) %>%
# cut the y values per date
mutate(quartile = cut(y, breaks = 4, labels = c(1:4)))
dt <- dt %>%
# take the original dt, add in the newly calculated quartiles
full_join(new_dt, by = c("y", "date")) %>%
# replace the NAs by 0
mutate(quartile = ifelse (is.na(quartile), 0, quartile))