我有一个我称之为'd'的数据框,其格式如下:
Date Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec
1 1895 12.63 2.47 2.69 2.43 3.10 1.65 0.13 0.24 1.78 0.18 3.32 7.78
2 1896 13.08 3.86 5.14 5.91 1.61 0.10 0.00 0.05 0.44 3.76 9.51 8.71
3 1897 4.10 7.16 6.38 0.85 0.47 0.87 0.00 0.00 0.46 2.51 5.27 3.40
4 1898 1.97 6.14 0.29 0.30 2.40 0.49 0.00 0.00 1.10 1.32 2.40 2.11
5 1899 7.61 2.69 8.12 1.56 1.66 0.75 0.00 0.18 0.31 7.87 10.79 5.20
6 1900 8.68 2.44 3.53 1.75 2.95 0.33 0.00 0.25 0.60 5.69 9.38 5.00
我想按照以下格式重写它
Date Precip
1 1895-01-01 12.63
2 1895-02-01 2.47
3 1895-03-01 2.69
4 1895-04-01 2.43
...
70 1900-10-01 5.69
71 1900-11-01 9.38
72 1900-12-01 5.00
我能想到的唯一方法是创建一个新的数据帧,其中包含从开始到结束的每日日期序列,然后使用rbind将数据帧“d”的行连接到新的数据帧。有没有使用for循环更简洁的方法?谢谢你的帮助!
答案 0 :(得分:7)
我是使用stack
和as.Date
dat.l <- data.frame(dat[,1],stack(dat[,-1]))
dat <- data.frame(Date =as.Date(paste(dat.l[,1],dat.l[,3],'01',sep='/'),format='%Y/%b/%d'),
Precip= dat.l[,2])
Date Precip
1 1895-01-01 12.63
2 1896-01-01 13.08
3 1897-01-01 4.10
.....
70 1898-12-01 2.11
71 1899-12-01 5.20
72 1900-12-01 5.00
我注意到我的数据不符合我按日期订购的顺序:
dat[order(dat$Date),]
Date Precip
1 1895-01-01 12.63
7 1895-02-01 2.47
13 1895-03-01 2.69
19 1895-04-01 2.43
25 1895-05-01 3.10
31 1895-06-01 1.65
答案 1 :(得分:4)
我是在没有for循环的情况下从你建议的日期策略开始的。
df2 <- data.frame(Date = seq.Date(as.Date("1895-01-01"),
as.Date("1900-12-01"),
by="month"),
Precip =c(t(data.matrix(dfrm[-1]) ) ))
head(df2)
Date Precip
1 1895-01-01 12.63
2 1895-02-01 2.47
3 1895-03-01 2.69
4 1895-04-01 2.43
5 1895-05-01 3.10
6 1895-06-01 1.65
答案 2 :(得分:2)
您可能希望在此处理时间序列对象:
x <- c(12.63, 2.47, 2.69, 2.43, 3.1, 1.65, 0.13, 0.24, 1.78, 0.18,
3.32, 7.78, 13.08, 3.86, 5.14, 5.91, 1.61, 0.1, 0, 0.05, 0.44,
3.76, 9.51, 8.71, 4.1, 7.16, 6.38, 0.85, 0.47, 0.87, 0, 0, 0.46,
2.51, 5.27, 3.4, 1.97, 6.14, 0.29, 0.3, 2.4, 0.49, 0, 0, 1.1,
1.32, 2.4, 2.11, 7.61, 2.69, 8.12, 1.56, 1.66, 0.75, 0, 0.18,
0.31, 7.87, 10.79, 5.2, 8.68, 2.44, 3.53, 1.75, 2.95, 0.33, 0,
0.25, 0.6, 5.69, 9.38, 5)
x.ts <- ts(x, frequency=12, start=(1895))
x.ts
## Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec
## 1895 12.63 2.47 2.69 2.43 3.10 1.65 0.13 0.24 1.78 0.18 3.32 7.78
## 1896 13.08 3.86 5.14 5.91 1.61 0.10 0.00 0.05 0.44 3.76 9.51 8.71
## 1897 4.10 7.16 6.38 0.85 0.47 0.87 0.00 0.00 0.46 2.51 5.27 3.40
## 1898 1.97 6.14 0.29 0.30 2.40 0.49 0.00 0.00 1.10 1.32 2.40 2.11
## 1899 7.61 2.69 8.12 1.56 1.66 0.75 0.00 0.18 0.31 7.87 10.79 5.20
## 1900 8.68 2.44 3.53 1.75 2.95 0.33 0.00 0.25 0.60 5.69 9.38 5.00
然后xts
将根据您的需要设置格式(除了可以通过时间序列完成的其他事项):
head(as.xts(x.ts))
## [,1]
## Jan 1895 12.63
## Feb 1895 2.47
## Mar 1895 2.69
## Apr 1895 2.43
## May 1895 3.10
## Jun 1895 1.65
答案 3 :(得分:2)
使用data.table
的解决方案:
require(data.table)
dt <- data.table(dat, key="Date")
dt.out <- dt[, list(Date_01 = as.Date(paste(Date, 1:12, "01", sep="/")),
Precip = unlist(.SD)), by=Date][, Date := NULL]
setnames(dt.out, "Date_01", "Date")
答案 4 :(得分:1)
是的,请查看melt
包中的reshape2
功能。它实际上非常简单。在此处阅读更多内容:http://www.jstatsoft.org/v21/i12/paper
你会这样做:
install.packages("reshape2")
library(reshape2)
melt(DF, id="Date", measured=c(2:13))