2016-12-27 3 views
1

У меня есть два набора данных из эксперимента на человека при различных температурах окружающей среды. P1 представляет данные физиологического ответа пациента и P1IAQ представляют данные мониторинга окружающей среды во время эксперимента. P1 записывал данные 32 раза в секунду, но P1IAQ записывал данные каждые 10 секунд.Синхронизация и построение наборов данных с двумя таймерами в R

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 временную задержку после снижения темпов окружающей среды? Skin Temp Ambient Temp

EDIT: dput для P1IAQ Я добавил первые двадцать значения для данных об окружающей среде. Я думаю, лучше всего было бы вычесть 12:04:07 из всех значений, чтобы сделать время начала 00:00:00. Я попытался взглянуть на лубридата.

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

Это сообщение datetime выглядит интересно, но оно предназначено для печати дат, а не для их изменения. Plotting data against time in 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)) 

EDIT: Я синхронизировал раз с помощью 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') 

enter image description here

+2

Когда вы говорите, что метка времени 'P1' неправильно, вы имеете в виду, что есть постоянное смещение от истинного времени? Если да, то что такое смещение? – eipi10

+0

@ eipi10 Я хотел бы переместить время запуска времени мониторинга окружающей среды с 12:04:07 до 0: 0: 0, чтобы совпасть с временем температуры кожи. (или наоборот). – HCAI

+0

Просьба пояснить, что вы имеете в виду с вашим утверждением: «Временная метка на« P1 »неверна». Благодарю. – lrnzcig

ответ

1

Если вам нужно всего лишь раз в каждом фрейме данных находиться в общем масштабе, вы можете конвертировать оба из них в числовые секунды, прошедшие с самого начала опыта и не беспокоиться о дате или классе времени. Затем вы можете присоединиться к двум кадрам данных на основе общей шкалы времени.

Я использовал ваш образец данных P1IAQ и создал фальшивые данные P1, чтобы пойти с ним. Time в моем P1, вероятно, не в том же формате, что и ваши фактические данные. Если вы разместите образец своего 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$Time и P1IAQ$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) 

Регистрация P1 и P1IAQ по nTime:

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) 

Plot после преобразования данных от широкоугольного до длинного формата:

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*")")) 

enter image description here

Другим вариантом является участок температура cha по сравнению с началом эксперимента. Таким образом, вы можете иметь обе линии на одной и той же панели без необходимости иметь дело с ними, находясь в разных местах:

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="") 

enter image description here

+0

Это потрясающе, спасибо вам большое! Мне интересно, есть ли способ узнать, что происходит, когда сдвиг температуры окружающей среды влияет на температуру кожи. Считаете ли вы, что лучше всего делать это визуально с графика? Или численно? Но я не уверен, что обработка сигналов - это правильный путь ... – HCAI

+0

Я построил все переменные в формате ваших первых графиков. Знаете ли вы, как сделать названия осей y разными? Например. Температура, CO2 (ppm) и т. Д. – HCAI

+1

Для вашего первого вопроса, я предлагаю задать вопрос о [CrossValidated] (http://stats.stackexchange.com/), сайте Q & A для статистических консультаций. Одна вещь, которую вы могли бы рассмотреть, заключается в том, имеет ли смысл интерполировать значения «P1IAQ», а не предполагать, что они плоские между измерениями. Интерполяция кажется хорошим вариантом, если у вас есть основания полагать, что значения изменяются монотонно между измерениями. – eipi10

1

У меня нет данных, но я буду готовить что-то подобное ... В этом случае длина P1 является Diferent с 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') 

enter image description here

+0

Спасибо за это. Одна вещь, которая выделяется, заключается в том, что мои столбцы P1IAQ $ Temp и P1 $ Temp имеют очень разную длину ... – HCAI

+0

Новое обновление с вашими запросами! – derive111

 Смежные вопросы

  • Нет связанных вопросов^_^