按行堆栈数据

时间:2018-01-22 16:45:52

标签: r dataframe

我有这样的数据集:

df <- data.frame(v1 = rnorm(12),
                 v2 = rnorm(12),
                 v3 = rnorm(12),
                 time = rep(1:3,4))

看起来像这样:

> head(df)
          v1         v2         v3 time
1  0.1462583 -1.1536425  3.0319594    1
2  1.4017828 -1.2532555 -0.1707027    2
3  0.3767506  0.2462661 -1.1279605    3
4 -0.8060311 -0.1794444  0.1616582    1
5 -0.6395198  0.4637165 -0.9608578    2
6 -1.6584524 -0.5872627  0.5359896    3

我现在想要在新列中堆叠第1-3行,然后在第4-6行,然后是7-9,依此类推。

这可能是天真的方式,但必须有快速的方法,不使用那么多的辅助变量和循环:

l <- list()
for(i in 1:length(df)) {
  l[[i]] <- stack(df[i:(i+2), -4])$values #time column is removed, was just for illustration
}
result <- do.call(cbind, l)

只能使用基数R.

1 个答案:

答案 0 :(得分:1)

我们可以在'时间'列

上使用split
sapply(split(df[-4], cumsum(df$time == 1)), function(x) stack(x)$values)

或者代替stackunlist可能更快

sapply(split(df[-4], cumsum(df$time == 1)), unlist)

基于OP的代码,它似乎是根据列

的顺序对行进行子集化
sapply(1:length(df), function(i) unlist(df[i:(i+2), -4]))