我不擅长"R“和不知道如何重新排列和子集时间序列数据。抱歉,如果这个问题听起来很蠢。我有一个海潮的时间序列数据,每天有四个值(也有缺失值)。两个涨潮值和两个低潮值。时间和日期在同一列中,但在不同的行中。现在,我只想对白天(从早上7:00到晚上7:00 )的数据进行子集,而不是晚上。然后,我想把数据整理成三列对于潮汐,我只需要最小值和最大值。这里是数据和所需的数据安排的一个例子。对于每个日期,数据排列为三行,类似于示例。
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 mDate 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发布于 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)。
然后,我们使用by将DF拆分为组,并将指示的匿名函数应用于由g定义的每个组。
匿名函数结合当前组中的日期和时间来创建日期/时间dt,该函数利用公共日期为x[1,1]和清理前的时间为x[2,-1]这一事实。使用dt和x[2, -1]中的潮汐(在清理之前),它计算三列中的每一列,将它们排列成一个数据框架。然后有一个注释行,它移除NA值。如果你想取消评论的话。对到目前为止的7点到7点的时间周期的数据帧进行了子集,并进一步采用了由最小潮位和最大潮位组成的两列。我们按时间分类。
最后,do.call("rbind", ...)将这些组放在一个整体数据框架中。
不使用包装。
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点之间,所以这里的输出必然是不同的。
> 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被假定为可复制的形式如下:
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)发布于 2017-08-05 15:43:39
如果列表不太长,通过映射单元格和过滤,在电子表格中完成这项工作将更加简单。但是,在R与动物园和tidyverse一起做这件事的一种方法是:
假设原始数据文件中的列名为C1:C5
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类型。您可能需要将“时间”转换为分钟的向量。
https://stackoverflow.com/questions/45522815
复制相似问题