1

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

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 列。前 2 行是前两行,后两行是后两行。对于前两行和最后两行,它需要写为 NA。如何在 reshape 包中使用 cast 来完成此操作?

最终输出看起来像

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

... 等等...

非常感谢提前

4

2 回答 2

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
于 2012-12-01T20:54:37.697 回答
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
于 2012-12-01T21:46:27.250 回答