簡體   English   中英

在R中同步並繪制兩個時間序列數據集

[英]Synchronise and plot two timeseries data sets in R

我在不同的環境溫度下從一個人的實驗中獲得了兩個數據集。 P1代表患者的生理反應數據, P1IAQ代表實驗期間的環境監測數據。 P1每秒記錄32次數據,而P1IAQ每10秒記錄一次數據。

head(P1IAQ)
     Time   RH  Temp CO2
1 12:04:07 44.2 19.89 664
2 12:04:17 44.2 19.89 664
3 12:04:27 44.2 19.89 665
4 12:04:37 44.2 19.89 665
5 12:04:47 44.2 19.89 666
6 12:04:57 44.2 19.89 668

head(P1)
      Time   SkinTemp HeartRate RespirationRate
1 00:00:00 27.781        70              10
2 00:00:00 27.780        70              10
3 00:00:00 27.779        70              10
4 00:00:00 27.779        70              10
5 00:00:00 27.778        70              10
6 00:00:00 27.777        70              10

我的問題是P1上的時間戳錯誤。 如何將它們一起繪制在同一張圖上,以查看SkinTemp在降低環境溫度之后是否存在時滯? 皮膚溫度 環境溫度

編輯:P1IAQ的dput我已經添加了環境數據的前20個值。 我認為最好的辦法是從所有值中減去12:04:07,以使開始時間為00:00:00。 我試着看了lubridate。

library(lubridate)
P1IAQ$Time<-hms(P1IAQ$Time)

這個datetime帖子看起來很有趣,但是它是用於繪制日期而不是實際更改日期。 根據時間在R中繪制數據

dput(P1IAQ)
structure(list(Time = structure(1:19, .Label = c("12:04:07", 
"12:04:17", "12:04:27", "12:04:37", "12:04:47", "12:04:57", "12:05:07", 
"12:05:17", "12:05:27", "12:05:37", "12:05:47", "12:05:57", "12:06:07", 
"12:06:17", "12:06:27", "12:06:37", "12:06:47", "12:06:57", "12:07:07"
), class = "factor"), RH = c(44.2, 44.2, 44.2, 44.2, 44.2, 44.2, 
44.2, 44.2, 44.1, 44.1, 44.2, 44.2, 44.2, 44.3, 44.2, 44.2, 44.2, 
44.3, 44.3), Temp = c(19.89, 19.89, 19.89, 19.89, 19.89, 19.89, 
19.89, 19.89, 19.89, 19.89, 19.94, 19.89, 19.94, 19.94, 19.94, 
19.94, 19.94, 19.94, 19.94), CO2 = c(664L, 664L, 665L, 665L, 
666L, 668L, 668L, 669L, 667L, 670L, 670L, 672L, 675L, 677L, 682L, 
684L, 685L, 686L, 687L)), .Names = c("Time", "RH", "Temp", "CO2"
), class = "data.frame", row.names = c(NA, -19L))

編輯:我已經使用lubridate同步了時間:

P1IAQ$Time<-period_to_seconds(hms(as.character(P1IAQ$Time))-hms("12:04:07"))
P1$Time<-period_to_seconds(hms(as.character(P1$Time)))

但是現在將它們繪制在一起很棘手。 我已經嘗試過ggplot2,但無法獲得兩個垂直軸。 有什么想法嗎

ggplot() + 
  geom_line(data = P1IAQ, aes(x = Time, y = Temp, color = "red")) +
  geom_line(data = P1, aes(x = Time, y = Temp, color = "blue"))  +
  xlab('Time (s)') +
  ylab('Temperature ºC')

在此處輸入圖片說明

我沒有您的數據,但我會准備類似的東西...在這種情況下,P1的長度與P1IAQ不同:

library(ggplot2)
#I create a sample of your data
P1<-data.frame(1:10,51:60)
P1IAQ<-data.frame(1:8,1:8)
colnames(P1)<-c("Time","Temp")
colnames(P1IAQ)<-c("Time","Temp")

# I cathegory your data for plot
df = data.frame(Time=c(P1$Time,P1IAQ$Time), values=c(P1$Temp,P1IAQ$Temp),type=c(rep("P1",length(P1$Time)),rep("P1IAQ",length(P1IAQ$Time))))

ggplot(data=df, aes(x=Time, y=values, color=type)) +
  geom_line() +
  facet_grid(type ~ ., scales="free") +
  xlab('Time (s)') +
  ylab('Temperature ºC')

在此處輸入圖片說明

如果您只需要將每個數據幀中的時間設置為通用比例,則可以將它們都轉換為自實驗開始以來經過的數字秒,而不必擔心日期或時間類別。 然后,您可以根據公共時間范圍將兩個數據幀合並在一起。

我使用了您的P1IAQ數據樣本,並創建了偽造的P1數據。 我的P1 Time可能與您的實際數據格式不同。 如果您發布P1的樣本,我可以調整以下示例以適合您的實際數據。

library(dplyr)
library(reshape2)
library(hms)
library(zoo)
library(ggplot2)
theme_set(theme_light())

# Fake P1 data frame
set.seed(10)
n=32*60*3 + 1
P1 = data.frame(Time=as.POSIXct(seq(0,180,length.out=n), origin=as.Date("2016-05-01"), tz="GMT"),
                SkinTemp = round(cumsum(rnorm(n, 0, 0.01)) + 27.78, 2),
                RespirationRate=round(rnorm(n, 10, 0.5)))

P1$TimeP1IAQ$Time轉換P1$Time等於實驗開始以來經過的秒數的數值。 (請注意,您發布的數據中的P1IAQ$Time是一個factor ,因此在進行進一步處理之前,我將其轉換為字符。):

P1$nTime = as.numeric(as.hms(P1$Time))

P1IAQ$nTime = as.numeric(as.hms(as.character(P1IAQ$Time)))
P1IAQ$nTime = P1IAQ$nTime - min(P1IAQ$nTime)

通過nTime加入P1P1IAQ

P1j = full_join(P1, P1IAQ, by="nTime", suffix=c("_P1","_P1IAQ")) %>%
  # Make sure joined data frame is sorted by nTime
  arrange(nTime) %>% 
  # Fill missing values with Last One Carried Forward
  mutate_at(vars(Time_P1IAQ, RH, Temp, CO2), na.locf)

將數據從寬格式轉換為長格式后進行繪圖:

ggplot(P1j %>% select(Time_P1IAQ, nTime, Skin=SkinTemp, Ambient=Temp) %>%
         # Convert from wide to long format for plotting
         melt(id.var=c("Time_P1IAQ", "nTime")), 
       aes(nTime, value, group=Time_P1IAQ)) +
  geom_line() +
  facet_grid(variable ~ ., scales="free_y") +
  scale_y_continuous(expand=c(0.5,0)) +
  labs(x="Elapsed Time (sec)", y=expression(Temperature~"("*degree*C*")"))

在此處輸入圖片說明

另一個選擇是繪制相對於實驗開始的溫度變化。 這樣,您可以將兩條線放在同一面板上,而不必將它們放在不同的位置:

ggplot(P1j %>% select(Time_P1IAQ, nTime, Skin=SkinTemp, Ambient=Temp) %>% 
         # Convert from wide to long format for plotting
         melt(id.var=c("Time_P1IAQ", "nTime")) %>% 
         # Convert temperatures to difference from starting values
         group_by(variable) %>% 
         mutate(value = value - value[nTime==min(nTime)]), 
       aes(nTime, value, colour=variable)) +
  geom_line() +
  labs(x="Elapsed Time (sec)", y=expression(Temperature~Change~"("*degree*C*")"),
       colour="")

在此處輸入圖片說明

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM