Проверьте, изменяется ли классификатор / атрибут идентификатора с одного месяца на следующий, и если это так, создайте список изменений - PullRequest
0 голосов
/ 21 марта 2019

У меня есть data.frame со столбцом «DATE», столбцом «ID» и столбцом «CLASSIFIER», следующим образом:

set.seed(11)
Data <- data.frame(
        DATE = sample(seq(as.Date("2010-02-01"), length=12, by="1 month") - 1,50,replace = TRUE),
        ID = sample(1:9,50,replace = TRUE),
        CLASSIFIER = sample(c("yes", "no"), 50, replace = TRUE)
      )

Вывод выглядит следующим образом:

        DATE ID CLASSIFIER
1 2010-03-31  3        yes
2 2010-04-30  3         no
3 2010-04-30  4         no
4 2010-06-30  4        yes
5 2010-09-30  2         no
6 2010-11-30  5         no

Теперь я хотел бы получить список тех идентификаторов, чей классификатор меняется с одной даты на другую.Другими словами, я хочу получить список всех идентификаторов (включая соответствующую дату), которые меняются с "yes" до "no" или с "no" до "yes" с одного месяца до следующего.Для пояснения, от одного месяца к следующему я говорю строго в хронологическом порядке - ранжирование дат в фрейме data.frame должно быть неуместным.Таким образом, изменение для данного идентификатора может, например, произойти только в 2010-02-28, если существует запись для того же идентификатора в 2010-01-31 с противоположным CLASSIFIER.В идеале список также должен указывать природу изменения (т. Е. От "no" до "yes" или от "yes" до "no") Из вышеприведенного примера вывода (первые две строки), если идентификатор "3" имеет"yes" CLASSIFIER 2010-03-31 и "no" CLASSIFIER 2010-04-30, в списке должны быть указаны идентификаторы «3», «2010-04-30» и что-то вроде «да - нет»».Идентификатор «4» в строках 3 и 4 не будет рассматриваться как изменение, потому что изменение не происходило от одного месяца к следующему в хронологическом порядке.

Кто-нибудь, пожалуйста, помогите мне с этим?

Заранее большое спасибо за помощь!

С уважением,

C.

1 Ответ

1 голос
/ 21 марта 2019

Мне не совсем понятны ваши ожидаемые результаты, но, возможно, что-то подобное поможет вам начать?

library(tidyverse)
Data %>%
    group_by(ID) %>%
    mutate(status = if_else(
        CLASSIFIER != lag(CLASSIFIER),
        sprintf("change: %s to %s", lag(CLASSIFIER), CLASSIFIER),
        "nochange"))
## A tibble: 50 x 4
## Groups:   ID [9]
#   DATE          ID CLASSIFIER status
#   <date>     <int> <fct>      <chr>
# 1 2010-04-30     3 no         NA
# 2 2010-07-31     3 yes        change: no to yes
# 3 2010-02-28     9 no         NA
# 4 2010-02-28     1 yes        NA
# 5 2010-10-31     2 no         NA
# 6 2010-07-31     5 yes        NA
# 7 2010-04-30     6 yes        NA
# 8 2010-12-31     3 no         change: yes to no
# 9 2010-08-31     4 yes        NA
#10 2010-01-31     1 no         change: yes to no
## … with 40 more rows

Перекрестная проверка: для ID=3 есть изменение с CLASSIFIER="no" на "yes" между Date="2010-04-03" и Date="2010-07-31" в строках 1 и 2. Для ID=1 есть изменение с CLASSIFIER="yes" на "no" в строках 4 и 10.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...