我有这样的数据集:
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.
答案 0 :(得分:1)
我们可以在'时间'列
上使用split
sapply(split(df[-4], cumsum(df$time == 1)), function(x) stack(x)$values)
或者代替stack
,unlist
可能更快
sapply(split(df[-4], cumsum(df$time == 1)), unlist)
基于OP的代码,它似乎是根据列
的顺序对行进行子集化sapply(1:length(df), function(i) unlist(df[i:(i+2), -4]))