我有这样一个数据集:
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基。
发布于 2018-01-22 08:48:36
我们可以在“time”列上使用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]))
https://stackoverflow.com/questions/48386450
复制