[英]How to summarise time-series data with unequal number of observations with R
我有一個大的數據框(86000行),其中包括幾位患者,每位患者在其逗留期間均進行了幾次驗血(僅進行了3次測試:T1,T2和T3)。 這些患者中有些住院了3天,有些住院了168天。
這只是count函數輸出的一小部分,它顯示了住院時間的巨大變化:
No Id Days
148 29757 111
149 30368 36
150 31062 29
151 31993 24
152 32198 51
153 32438 6
154 32836 74
155 32944 24
156 33467 39
157 36108 90
158 36849 6
159 37136 3
我使用匯總來計算均值等,但是我想總結一下誰在逗留期間確實有所改善或惡化。
我認為,這將涉及至少提取第一個和最后一個測試,並取其差(越低越好)。 但是我找不到辦法。
我認為一個更簡單的解決方案是將整個結果轉換為有序數據(根據測試的正常范圍),並查看其中有多少個值異常低或異常高。 不幸的是,幾乎每個病人都有高潮和低潮。
理想情況下,我希望了解幾位患者(或一組患者)隨時間的進展。 但是,由於他們在不同的時間范圍內住院,(過於簡化)的結果是這樣的:
如您所見,第一位患者(紅點)以中等水平開始,迅速惡化(高水平),然后好轉(較低水平)。 第二名患者的進展尚不清楚,因為他/她的住院時間可能很短。
有人可以建議一個入門者(代碼或想法)嗎? 我用不相等的觀測值檢查了關於多個時間序列圖的 一些問題 ,但是它們對我的情況沒有幫助。 示例數據集(匿名)在這里:
structure(list(Id = c("10200", "10200", "10200", "10200", "10200",
"10200", "10700", "10700", "10700", "10700", "10700", "10700",
"10700", "10700", "10700", "10700", "10700", "10700", "10700",
"10700", "10700", "10766", "10766", "10766", "10766", "10766",
"10766", "10766", "10766", "10766", "10766", "10766", "10766",
"10766", "10766", "10766", "10766", "10766", "10766", "10766"
), Date = structure(c(15068, 15068, 15068, 15069, 15069, 15069,
15072, 15072, 15072, 15072, 15072, 15072, 15073, 15073, 15073,
15075, 15075, 15075, 15078, 15078, 15078, 15073, 15074, 15074,
15075, 15075, 15075, 15075, 15076, 15076, 15076, 15078, 15078,
15078, 15081, 15082, 15083, 15084, 15085, 15085), class = "Date"),
Test = c("T1", "T2", "T3", "T1", "T2", "T3", "T1", "T1",
"T2", "T2", "T3", "T3", "T1", "T2", "T3", "T1", "T2", "T3",
"T1", "T2", "T3", "T1", "T1", "T2", "T1", "T1", "T2", "T2",
"T1", "T2", "T3", "T1", "T2", "T3", "T1", "T1", "T2", "T1",
"T1", "T2"), Result = c(131, 4.53, 5.4, 108, 3.19, 3.7, 125,
NA, 1.26, NA, NA, 3.8, 125, 0.97, 4.2, 73, 0.84, 6.6, 48,
0.52, 4.8, 60, 75, 0.83, 52, 51, 0.62, 0.65, 40, 0.57, 4.1,
45, 0.54, 3.7, 96, 77, 1.04, 134, 144, 0.95)), .Names = c("Id",
"Date", "Test", "Result"), row.names = c(3L, 6L, 4L, 2L, 1L,
5L, 10L, 14L, 9L, 19L, 8L, 11L, 20L, 18L, 7L, 17L, 13L, 21L,
12L, 15L, 16L, 22L, 28L, 29L, 24L, 31L, 26L, 33L, 34L, 32L, 37L,
23L, 35L, 25L, 38L, 36L, 30L, 27L, 39L, 40L), class = "data.frame")
我不知道這是不是您想要的,但是您可以使用dplyr包。 下面的代碼將按“ Id”對數據進行分組,然后在Result中查找第一個和最后一個值,最后在新列中計算“差”
mydata <- structure(list(Id=c ( "10200", "10200", "10200", "10200", "10200", "10200", "10700", "10700", "10700", "10700", "10700", "10700", "10700", "10700", "10700", "10700", "10700", "10700", "10700", "10700", "10700", "10766", "10766", "10766",
"10766", "10766", "10766", "10766", "10766", "10766", "10766", "10766", "10766", "10766", "10766", "10766", "10766", "10766", "10766", "10766" ), Date=s tructure(c(15068, 15068, 15068, 15069, 15069, 15069, 15072, 15072, 15072, 15072, 15072, 15072, 15073, 15073,
15073, 15075, 15075, 15075, 15078, 15078, 15078, 15073, 15074, 15074, 15075, 15075, 15075, 15075, 15076, 15076, 15076, 15078, 15078, 15078, 15081, 15082, 15083, 15084, 15085, 15085), class="Date" ), Test=c ( "T1", "T2", "T3", "T1", "T2", "T3", "T1",
"T1", "T2", "T2", "T3", "T3", "T1", "T2", "T3", "T1", "T2", "T3", "T1", "T2", "T3", "T1", "T1", "T2", "T1", "T1", "T2", "T2", "T1", "T2", "T3", "T1", "T2", "T3", "T1", "T1", "T2", "T1", "T1", "T2"), Result=c (131, 4.53, 5.4, 108, 3.19, 3.7, 125, NA, 1.26,
NA, NA, 3.8, 125, 0.97, 4.2, 73, 0.84, 6.6, 48, 0.52, 4.8, 60, 75, 0.83, 52, 51, 0.62, 0.65, 40, 0.57, 4.1, 45, 0.54, 3.7, 96, 77, 1.04, 134, 144, 0.95)), .Names=c ( "Id", "Date", "Test", "Result"), row.names=c (3L, 6L, 4L, 2L, 1L, 5L, 10L, 14L, 9L, 19L,
8L, 11L, 20L, 18L, 7L, 17L, 13L, 21L, 12L, 15L, 16L, 22L, 28L, 29L, 24L, 31L, 26L, 33L, 34L, 32L, 37L, 23L, 35L, 25L, 38L, 36L, 30L, 27L, 39L, 40L), class="data.frame" )
library(dplyr)
result <- mydata %>%
group_by(Id) %>%
summarise_each(funs(first, last), Result) %>%
mutate(difference = first - last)
result
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.