#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()
Я думаю, это показывает, что вы еще не описали проблему достаточно подробно, чтобы обеспечить согласованный ответ.