首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >逐行堆栈数据帧

逐行堆栈数据帧
EN

Stack Overflow用户
提问于 2018-01-22 16:45:51
回答 1查看 24关注 0票数 1

我有这样一个数据集:

代码语言:javascript
复制
df <- data.frame(v1 = rnorm(12),
                 v2 = rnorm(12),
                 v3 = rnorm(12),
                 time = rep(1:3,4))

看起来是这样的:

代码语言:javascript
复制
> 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行等等。

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

代码语言:javascript
复制
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基。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-01-22 16:48:36

我们可以在“time”列上使用split

代码语言:javascript
复制
sapply(split(df[-4], cumsum(df$time == 1)), function(x) stack(x)$values)

或者代替stackunlist可以更快

代码语言:javascript
复制
sapply(split(df[-4], cumsum(df$time == 1)), unlist)

根据OP的代码,它似乎是根据列的顺序来对行进行细分

代码语言:javascript
复制
sapply(1:length(df), function(i) unlist(df[i:(i+2), -4]))
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/48386450

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档