[英]time-series in a data frame: re-order data
我有一個由以下結構的測量軟件生成的時間序列數據集:
ID1 ID2 START mes1 mes2 mes3 mes4 mes5 mes6
myidA aa 2000 12 58 45 66 88 77
myidB aa 2004 44 89 NA NA NA NA
myidC ab 2001 69 58 77 88 87 NA
myidD ab 2004 78 66 NA NA NA NA
START表示較舊的測量年份,該年份保存在第一個測量列(mes1)中。 對於每個樣本(數據框的每一行),開始年份可以不同。
我想創建以下數據框,其中按年份對測量進行排序(用測量的年數代替n°測量):
ID1 ID2 START 2000 2001 2002 2003 2004 2005
myidA aa 2000 12 58 45 66 88 77
myidB aa 2004 NA NA NA NA 44 89
myidC ab 2001 NA 69 58 77 88 87
myidD ab 2004 NA NA NA NA 78 66
我可能必須使用時間序列對象,但我不知道如何處理ID(我需要保留它們)和START。
這是我要采取的方法:
library(reshape2)
dfL <- melt(mydf, id.vars=c("ID1", "ID2", "START"))
dfL <- dfL[complete.cases(dfL), ]
head(dfL)
# ID1 ID2 START variable value
# 1 myidA aa 2000 mes1 12
# 2 myidB aa 2004 mes1 44
# 3 myidC ab 2001 mes1 69
# 4 myidD ab 2004 mes1 78
# 5 myidA aa 2000 mes2 58
# 6 myidB aa 2004 mes2 89
dfL$year <- dfL$START + as.numeric(gsub("mes", "", dfL$variable))-1
dcast(dfL, ID1 + ID2 + START ~ year, value.var="value")
# ID1 ID2 START 2000 2001 2002 2003 2004 2005
# 1 myidA aa 2000 12 58 45 66 88 77
# 2 myidB aa 2004 NA NA NA NA 44 89
# 3 myidC ab 2001 NA 69 58 77 88 87
# 4 myidD ab 2004 NA NA NA NA 78 66
基本思想是利用“ mes1”,“ mes2”值將值“推”到新擴展的data.frame
中的正確位置。
這是我使用的“ mydf”,以防其他任何人想刺中此事。
mydf <- structure(
list(ID1 = c("myidA", "myidB", "myidC", "myidD"),
ID2 = c("aa", "aa", "ab", "ab"),
START = c(2000L, 2004L, 2001L, 2004L),
mes1 = c(12L, 44L, 69L, 78L), mes2 = c(58L, 89L, 58L, 66L),
mes3 = c(45L, NA, 77L, NA), mes4 = c(66L, NA, 88L, NA),
mes5 = c(88L, NA, 87L, NA), mes6 = c(77L, NA, NA, NA)),
.Names = c("ID1", "ID2", "START", "mes1", "mes2", "mes3",
"mes4", "mes5", "mes6"), class = "data.frame",
row.names = c(NA, -4L))
mydf
# ID1 ID2 START mes1 mes2 mes3 mes4 mes5 mes6
# 1 myidA aa 2000 12 58 45 66 88 77
# 2 myidB aa 2004 44 89 NA NA NA NA
# 3 myidC ab 2001 69 58 77 88 87 NA
# 4 myidD ab 2004 78 66 NA NA NA NA
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.