首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >时间序列数据的整理

时间序列数据的整理
EN

Stack Overflow用户
提问于 2017-08-05 14:08:18
回答 2查看 108关注 0票数 1

我不擅长"R“和不知道如何重新排列和子集时间序列数据。抱歉,如果这个问题听起来很蠢。我有一个海潮的时间序列数据,每天有四个值(也有缺失值)。两个涨潮值和两个低潮值。时间和日期在同一列中,但在不同的行中。现在,我只想对白天(从早上7:00到晚上7:00 )的数据进行子集,而不是晚上。然后,我想把数据整理成三列对于潮汐,我只需要最小值和最大值。这里是数据和所需的数据安排的一个例子。对于每个日期,数据排列为三行,类似于示例。

代码语言:javascript
复制
1/1/2011    Low High    Low NA
Time    2:58 AM 9:38 AM 5:19 PM NA
Tide    1.2 m   2.2 m   0.6 m   NA
1/2/2011    High    Low High    Low
Time    2:07 AM 4:22 AM 10:19 AM    6:07 PM
Tide    1.4 m   1.3 m   2.3 m   0.4 m

代码语言:javascript
复制
Date    Time    Tide
1/1/2011    17:19   0.6
1/1/2011    9:38    2.2
1/2/2011    2:07    1.4
1/2/2011    18:07   0.4
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-08-05 15:45:04

假设输入,DF如下所示。

g,分组向量,每行DF有一个元素,等于c(1, 1, 1, 2, 2, 2, ...)。计算g的替代方法是n <- nrow(DF); g <- gl(n, 3, n)n <- nrow(DF); g <- rep(1:3, n, n)

然后,我们使用byDF拆分为组,并将指示的匿名函数应用于由g定义的每个组。

匿名函数结合当前组中的日期和时间来创建日期/时间dt,该函数利用公共日期为x[1,1]和清理前的时间为x[2,-1]这一事实。使用dtx[2, -1]中的潮汐(在清理之前),它计算三列中的每一列,将它们排列成一个数据框架。然后有一个注释行,它移除NA值。如果你想取消评论的话。对到目前为止的7点到7点的时间周期的数据帧进行了子集,并进一步采用了由最小潮位和最大潮位组成的两列。我们按时间分类。

最后,do.call("rbind", ...)将这些组放在一个整体数据框架中。

不使用包装。

代码语言:javascript
复制
g <- cumsum(grepl("\\d", DF$V1))
Long <- do.call("rbind", by(DF, g, function(x) {
  dt <- as.POSIXct(paste(x[1,1], as.matrix(x[2, -1])), format = "%m/%d/%Y %I:%M %p")
  X <- data.frame(Date = as.Date(dt),
                  Time = format(dt, "%H:%M"),
                  Tide = as.numeric(sub("m", "", as.matrix(x[3, -1]))),
                  stringsAsFactors = FALSE)
  # X <- na.omit(X)
  X <- subset(X, Time >= "07:00" & Time <= "19:00")
  X <- X[c(which.min(X$Tide), which.max(X$Tide)), ]
  X[order(X$Time), ]
}))

请注意,问题的第三行不是上午7点到下午7点之间,所以这里的输出必然是不同的。

代码语言:javascript
复制
> Long
          Date  Time Tide
1.2 2011-01-01 09:38  2.2
1.3 2011-01-01 17:19  0.6
2.3 2011-01-02 10:19  2.3
2.4 2011-01-02 18:07  0.4

注:输入DF被假定为可复制的形式如下:

代码语言:javascript
复制
Lines <- "1/1/2011,Low,High,Low,NA
Time,2:58 AM,9:38 AM,5:19 PM,NA
Tide,1.2 m,2.2 m,0.6 m,NA
1/2/2011,High,Low,High,Low
Time,2:07 AM,4:22 AM,10:19 AM,6:07 PM
Tide,1.4 m,1.3 m,2.3 m,0.4 m"
DF <- read.table(text = Lines, sep = ",", as.is = TRUE)
票数 1
EN

Stack Overflow用户

发布于 2017-08-05 15:43:39

如果列表不太长,通过映射单元格和过滤,在电子表格中完成这项工作将更加简单。但是,在R与动物园和tidyverse一起做这件事的一种方法是:

假设原始数据文件中的列名为C1:C5

代码语言:javascript
复制
        C1      C2      C3       C4      C5
     <chr>   <chr>   <chr>    <chr>   <chr>
1 1/1/2010     Low    High      Low    <NA>
2     Time 2:58 AM 9:38 AM  5:19 PM    <NA>
3     Tide     1.2     2.2      0.6    <NA>
4 1/2/2011    High     Low     High     Low
5     Time 2:07 AM 4:22 AM 10:19 AM 6:07 PM
6     Tide     1.4     1.3      2.3     0.4

DF <- DF %>% 
        mutate(Date = as.Date(gsub("Tide|Time","", C1), format = "%d/%m/%Y"))
DF <- DF %>% 
        mutate(Date = na.locf(DF$Date, na.rm = TRUE),
                        C1 = gsub("[[:digit:]]|\\/", "", C1),
                        Type = if_else(nchar(C1) == 0, "TideType", C1)) %>% 
              select(Date, Type, C2:C5) %>% 
              gather(oColumn, Value, -c(Date, Type)) %>%
              spread(key = Type, value = Value) %>% 
              select(Date, Time, Tide) %>%
              filter(complete.cases(.))
DF <- DF %>% 
         mutate(Time = ymd_hm(paste(DF$Date, DF$Time, sep = " ")),
                Tide = as.numeric(Tide))
DF <- DF %>% 
         mutate(DayNight = (DF$Time) %within% 
          interval(as.POSIXlt(DF$Date) + (7*60*60), as.POSIXlt(DF$Date) + (19*60*60))) %>% 
        filter(DayNight == TRUE) %>%
        select(-DayNight) ) %>%
        group_by(Date) %>%
        filter(Tide == max(Tide) | min(Tide))

DF
Source: local data frame [4 x 3]
Groups: Date [2]

        Date                Time  Tide
      <date>              <dttm> <dbl>
1 2010-01-01 2010-01-01 09:38:00   2.2
2 2010-01-01 2010-01-01 17:19:00   0.6
3 2011-02-01 2011-02-01 10:19:00   2.3
4 2011-02-01 2011-02-01 18:07:00   0.4

请注意," Date“是对象的日期类型,而"Time”是日期时间对象的Po660类型。您可能需要将“时间”转换为分钟的向量。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/45522815

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档