R,使用重塑来提取前期数据

时间:2012-12-01 20:39:55

标签: r plyr reshape

我有一个简单的数据框如下

x = data.frame(id = seq(1,10),val = seq(1,10))
x
id val
1   1
2   2  
3   3
4   4
5   5
6   6
7   7
8   8
9   9
10  10

我想再添加4列。前两行是前两行,接下来两行是接下来的两行。对于前两行和后两行,它需要写为NA。 如何使用重塑包中的强制转换来实现此目的?

最终输出看起来像

1 1 NA NA 2 3
2 2 NA 1 3 4
3 3 1 2 4 5
4 4 2 3 5 6

......等等......

非常感谢提前

2 个答案:

答案 0 :(得分:2)

在您举例后,我更改了解决方案

 mat <- cbind(dat,
 c(c(NA,NA),head(dat$id,-2)),
 c(c(NA),head(dat$val,-1)),
 c(tail(dat$id,-1),c(NA)),
 c(tail(dat$val,-2),c(NA,NA)))


colnames(mat) <- c('id','val','idp','valp','idn','valn')

   id val idp valp idn valn
1   1   1  NA   NA   2    3
2   2   2  NA    1   3    4
3   3   3   1    2   4    5
4   4   4   2    3   5    6
5   5   5   3    4   6    7
6   6   6   4    5   7    8
7   7   7   5    6   8    9
8   8   8   6    7   9   10
9   9   9   7    8  10   NA
10 10  10   8    9  NA   NA

答案 1 :(得分:2)

这是一个sapply的解决方案。首先,选择新列的相对更改:

lags <- c(-2, -1, 1, 2)

创建新列:

newcols <- sapply(lags,
                  function(l) {
                    tmp <- seq.int(nrow(x)) + l; 
                    x[replace(tmp, tmp < 1 | tmp > nrow(x), NA), "val"]})

捆绑在一起:

cbind(x, newcols)

结果:

   id val  1  2  3  4
1   1   1 NA NA  2  3
2   2   2 NA  1  3  4
3   3   3  1  2  4  5
4   4   4  2  3  5  6
5   5   5  3  4  6  7
6   6   6  4  5  7  8
7   7   7  5  6  8  9
8   8   8  6  7  9 10
9   9   9  7  8 10 NA
10 10  10  8  9 NA NA