R - построить пары данных из пар последовательных строк, если они доступны в кадре данных в r - PullRequest
0 голосов
/ 11 октября 2019

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

Я бы предпочел использовать функцию group_by () пакета dplyr для отдельных лиц, но не уверен, как выбрать каждое погружение и связать его со следующим (последующим) всплытием.

df <- data.frame(ID=c("A","A","A","A","A","A","A","A","A","B","B","B","B","B","B","B","B","B"), 
What=c("Dive", "Surface", "Dive","Surface","Dive", "Surface", "Surface", "Dive", "Surface", "Dive", "Surface", "Dive", "Dive", "Surface", "Dive", "Surface", "Dive", "Surface"), 
Start=c("2010-05-09 17:29:45", "2010-05-09 17:56:24", "2010-05-09 18:22:15", "2010-05-09 18:52:38", "2010-05-09 18:59:02", "2010-05-09 19:24:37","2010-05-09 19:30:00", "2010-05-09 19:30:57", "2010-05-09 19:48:00","2010-05-03 18:49:35", "2010-05-03 18:58:00", "2010-05-03 19:27:51","2010-05-03 19:35:42", "2010-05-03 20:15:41", "2010-05-03 20:24:13","2010-05-03 20:53:32", "2010-05-03 21:01:31", "2010-05-03 21:40:26"), 
End=c("2010-05-09 17:56:24", "2010-05-09 18:22:15", "2010-05-09 18:52:38","2010-05-09 18:59:02", "2010-05-09 19:24:37", "2010-05-09 19:29:28","2010-05-09 19:30:57", "2010-05-09 19:48:00", "2010-05-09 19:49:02", "2010-05-03 18:58:06", "2010-05-03 19:27:51", "2010-05-03 19:35:42", "2010-05-03 20:15:41", "2010-05-03 20:24:13", "2010-05-03 20:53:32", "2010-05-03 21:01:31", "2010-05-03 21:40:26", "2010-05-03 21:48:44"), 
Duration = c(26.65, 25.85, 30.38,  6.40, 25.58,  4.85,  0.95, 17.05, 1.03,  8.52, 29.85,  7.85, 39.98,  8.53, 29.32,  7.98, 38.92,  8.30))

df$Start<-as.POSIXct(df$Start, format = "%Y-%m-%d %H:%M:%S")
df$End<-as.POSIXct(df$End, format = "%Y-%m-%d %H:%M:%S")

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

Любая помощь будет принята с благодарностью!

1 Ответ

0 голосов
/ 11 октября 2019

Я не уверен на 100% в том, что вы пытаетесь сделать, но если я правильно понимаю ... мы можем сделать некоторые манипуляции, чтобы получить фрейм данных из восьми строк с четырьмя парами поверхностей погружения для каждого издва человека:

df2 <- 
  df %>% 
  group_by(ID) %>% 
  filter(What != lead(What) | is.na(lead(What))) %>% 
  select(ID, What, Duration) %>% 
  mutate(dive_number = ceiling(row_number() / 2)) %>% 
  ungroup() %>% 
  spread(What, Duration)

# A tibble: 8 x 4
  ID    dive_number  Dive Surface
  <fct>       <dbl> <dbl>   <dbl>
1 A               1 26.6    25.8 
2 A               2 30.4     6.4 
3 A               3 25.6     0.95
4 A               4 17.0     1.03
5 B               1  8.52   29.8 
6 B               2 40.0     8.53
7 B               3 29.3     7.98
8 B               4 38.9     8.3 

Затем вы можете построить результаты:

df2 %>% 
  ggplot(aes(x = Surface, y = Dive, color = ID)) +
  geom_point()
...