【问题标题】:R, Using reshape to pull pre post dataR, 使用 reshape 拉取 pre post 数据
【发布时间】:2012-12-01 20:39:55
【问题描述】:

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

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

...等等...

非常感谢

【问题讨论】:

  • 您能否向我们提供您预期的 data.frame 应该是什么样子,以便我们更好地理解您的问题?

标签: r plyr reshape


【解决方案1】:

在你给出例子之后,我改变了解决方案

 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

【讨论】:

  • 这样不行。结果似乎是复制的列。我正在查看前 2 个值和构成 4 个新列的以下两个值。请参考我所做的修改。
【解决方案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

【讨论】:

  • 感谢您的努力。当我试图扩展它时,它并没有那么好,部分是我的错。发现另一个解决方案更容易阅读。
猜你喜欢
  • 2019-05-13
  • 2014-11-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-03-14
  • 1970-01-01
相关资源
最近更新 更多