Как я смогу отслеживать изменения по времени? Определите, когда условие появилось впервые — R

#r #tidyverse

#r #tidyverse

Вопрос:

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

Допустим, я отслеживал изменение цвета стен с течением времени; подумайте о погодных повреждениях. Я никогда не был последовательным в тот день или время, когда я начал отслеживать или отслеживал его. У меня есть повторяющиеся строки в терминах стен, потому что каждая строка представляет измерение в определенное время.

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

 Wall   Color   Date
A      yellow  2019-08
A      white  2019-02
A      yellow    2019-05
A      yellow  2019-05   
A      white  2019-04
A      white  2019-03
A      yellow  2019-08   
B      yellow  2019-09
B      white  2019-05
B      yellow  2020-09
B      yellow  2020-05
c      white  2019-05
c      white  2018-01
c      white  2020-06
c      white  2019-02
c      white  2020-03
c      yellow  2020-09
c      white  2020-06
c      yellow  2020-05
c      white  2019-01
c      yellow  2020-1
 

Ответ №1:

Вы можете попробовать :

 library(dplyr)

df %>%
  tidyr::separate(Date, c('Year', 'Month'), convert = TRUE) %>%
  arrange(Wall, Year, Month) %>%
  group_by(Wall) %>%
  mutate(change = Color != lag(Color, default = first(Color)), 
         change = row_number() == which(change)[1])

#   Wall  Color   Year Month change
#   <chr> <chr>  <int> <int> <lgl> 
# 1 A     white   2019     2 FALSE 
# 2 A     white   2019     3 FALSE 
# 3 A     white   2019     4 FALSE 
# 4 A     yellow  2019     5 TRUE  
# 5 A     yellow  2019     5 FALSE 
# 6 A     yellow  2019     8 FALSE 
# 7 A     yellow  2019     8 FALSE 
# 8 B     white   2019     5 FALSE 
# 9 B     yellow  2019     9 TRUE  
#10 B     yellow  2020     5 FALSE 
# … with 11 more rows
 

Комментарии:

1. Это частично так! Я думаю, что мне просто нужно одно значение TRUE для каждой «стены», поэтому просто укажите дату, когда оно изменилось. Итак, если оно изменилось в 2020-03 на желтый, то только 2020-03 будет помечено как «Стена» A.

2. Хорошо .. смотрите Обновленный ответ, чтобы получить только первое TRUE для каждого Wall . Также, я думаю Date , здесь также следует учитывать. Обновленный ответ должен помочь.

3. Спасибо! Из любопытства, какова была причина разделения месяца и года?

4. Потому 2019-08 что это символьное значение, а R не понимает его как дату. Итак, есть два варианта, которые мы можем выбрать: 1) Разделить на месяц и год или 2) Преобразовать в дату. Мы могли бы выбрать любой из вариантов, но я выбрал 1.

5. О, хорошо. Есть ли способ изменить это, чтобы отслеживать увеличение / уменьшение? Я знаю для этого примера изменения в категориальном, но в случае непрерывных. Или для этого потребуется совершенно другой код?

Ответ №2:

Я не понял, что требуется, но это немного кода R, который показывает, как выполнять некоторые операции, которые, я думаю, вы еще не освоили:

 > dat <- scan( text="A      yellow  2019-08
  A      white  2019-02
  A      yellow    2019-05
  A      yellow  2019-05   
  A      white  2019-04
  A      white  2019-03
  A      yellow  2019-08   
  B      yellow  2019-09
  B      white  2019-05
  B      yellow  2020-09
  B      yellow  2020-05
  c      white  2019-05
  c      white  2018-01
  c      white  2020-06
  c      white  2019-02
  c      white  2020-03
  c      yellow  2020-09
  c      white  2020-06
  c      yellow  2020-05
  c      white  2019-01
  c      yellow  2020-1", what=list(grp="",color="",mon=""))
Read 21 records
> dat=data.frame(dat)
> dat
   grp  color     mon
1    A yellow 2019-08
2    A  white 2019-02
3    A yellow 2019-05
4    A yellow 2019-05
5    A  white 2019-04
6    A  white 2019-03
7    A yellow 2019-08
8    B yellow 2019-09
9    B  white 2019-05
10   B yellow 2020-09
11   B yellow 2020-05
12   c  white 2019-05
13   c  white 2018-01
14   c  white 2020-06
15   c  white 2019-02
16   c  white 2020-03
17   c yellow 2020-09
18   c  white 2020-06
19   c yellow 2020-05
20   c  white 2019-01
21   c yellow  2020-1
> library(zoo)
> dat$mon<-as.yearmon(dat$mon)
> plot(as.numeric(dat$color)~dat$mon)
> plot(as.numeric(dat$color)~dat$mon, type="b")
> png(); 
  plot(jitter(as.numeric(dat$color)) ~dat$mon, type="b", col=as.numeric(dat$grp));
  dev.off()
 

введите описание изображения здесь

Я думаю, это показывает, что вы еще не описали проблему достаточно подробно, чтобы обеспечить согласованный ответ.