我在Excel中导入了一些时间序列,我有20列,每隔一列包含日期。 我想只有一个日期列,所有数据都对齐,NA不可用。
2007-06-11 1509 2007-06-11 1138 2008-01-17 990
2007-06-12 1493 2007-06-13 1200 2008-01-18 800
2007-06-13 1324 2007-06-14 1122 2008-01-19 880
应该给出
2007-06-11 1509 1138 NA
2007-06-12 1493 NA NA
2007-06-13 1324 1200 NA
...
谢谢!
答案 0 :(得分:0)
将数据分成几部分,然后merge
使用all.x = TRUE
选项加入各个部分(您可以优雅地使用Reduce
)。
dat <- read.table(sep=' ', text=
'2007-06-11 1509 2007-06-11 1138 2008-01-17 990
2007-06-12 1493 2007-06-13 1200 2008-01-18 800
2007-06-13 1324 2007-06-14 1122 2008-01-19 880')
#### break dat into appropriate pieces
# 1) alternating column indices
col_idx <- seq(1, ncol(dat), by=2)
# 2) each piece is two columns
dat_pieces <- lapply(col_idx, function(i) {
dat_piece <- dat[, c(i, i+1)]
# use common name for date columns
names(dat_piece)[1] <- 'date'
return(dat_piece)
})
#### merge all pieces
my_new_thing <- Reduce(
function(a, b) merge(a, b, by = 'date', all.x =T),
dat_pieces)
结果:
date V2 V4 V6
1 2007-06-11 1509 1138 NA
2 2007-06-12 1493 NA NA
3 2007-06-13 1324 1200 NA
答案 1 :(得分:0)
OP要求重塑输入数据的日期/值对,以便列出每个日期的值。
这两个步骤是必需的:
melt()
包中的data.table
函数能够同时重塑多个值列。第1、3、5,...列包含日期字符串,而第2、4、6,...列包含数值。
library(data.table)
long <- melt(setDT(input), measure.vars = list(date = seq(1, ncol(raw), by = 2),
value = seq(2, ncol(raw), by = 2)))
long
variable date value 1: 1 2007-06-11 1509 2: 1 2007-06-12 1493 3: 1 2007-06-13 1324 4: 2 2007-06-11 1138 5: 2 2007-06-13 1200 6: 2 2007-06-14 1122 7: 3 2008-01-17 990 8: 3 2008-01-18 800 9: 3 2008-01-19 880
现在,重塑为宽幅格式。 rowid()
函数用于创建值的压缩视图:
dcast(long, date ~ rowid(date, prefix = "V"))
date V1 V2 1: 2007-06-11 1509 1138 2: 2007-06-12 1493 NA 3: 2007-06-13 1324 1200 4: 2007-06-14 1122 NA 5: 2008-01-17 990 NA 6: 2008-01-18 800 NA 7: 2008-01-19 880 NA
或者,这些值可以显示为“稀疏矩阵”,原始列组号作为列标题。
dcast(long, date ~ variable)
date 1 2 3 1: 2007-06-11 1509 1138 NA 2: 2007-06-12 1493 NA NA 3: 2007-06-13 1324 1200 NA 4: 2007-06-14 NA 1122 NA 5: 2008-01-17 NA NA 990 6: 2008-01-18 NA NA 800 7: 2008-01-19 NA NA 880
library(data.table)
input <- fread(
"2007-06-11 1509 2007-06-11 1138 2008-01-17 990
2007-06-12 1493 2007-06-13 1200 2008-01-18 800
2007-06-13 1324 2007-06-14 1122 2008-01-19 880"
)