【问题标题】:R - Plot pairs of data from pairs of sequential rows where available in a data frame in rR - 绘制来自 r 中数据帧中可用的连续行对的数据对
【发布时间】:2020-02-09 08:06:17
【问题描述】:

我有一个包含多个人的时间序列数据的数据框。数据包括每个个体随时间变化的动物表面间隔和潜水间隔。对于每个表面间隔,我想使用 ggplot 来绘制表面间隔的持续时间与前一次可用潜水的持续时间。如果连续有两个表面间隔,我想忽略它们,只绘制直接在它们之前有潜水的表面。我想按个人 ID 执行此操作。 我在下面提供了一些示例数据:

我更喜欢为个人使用 dplyr 包 group_by() 函数,但不确定如何选择每次潜水并将其与以下(后续)表面配对。

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 轴为前一个潜水持续时间。如果连续进行两次潜水,则忽略第一次,将第二次与下一个表面相匹配;多个曲面也是如此;我只想选择在它们之前有潜水的表面。

任何帮助将不胜感激!

【问题讨论】:

    标签: r ggplot2 dplyr time-series sequential


    【解决方案1】:

    我不能 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()
    

    【讨论】:

    • 谢谢!这几乎正​​是我想要得到的(df2 数据框),除了一些有 2 个表面或连续 2 次潜水的行:我想要:df2 #A tibble:8 x 4 ID dive_number Dive Surface 1 A 1 26.6 25.8 2 A 2 30.4 6.4 3 A 3 25.6 4.85,不是 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
    猜你喜欢
    • 1970-01-01
    • 2021-10-19
    • 1970-01-01
    • 2020-07-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-04-02
    • 1970-01-01
    相关资源
    最近更新 更多