【问题标题】:How to stack rows of data frame如何堆叠数据框的行
【发布时间】:2017-01-18 20:44:14
【问题描述】:

我无法将 data.frame 中的行堆叠成一行。我的数据如下所示:

v1       v2      v3      index     
var1     ad      b1      1    
var2     sa      b2      2     
var3     4       b3      3     
var1     5       b4      1     
var2     6       b5      2    
var3     2       b6      3
.        .       .       . 
.        .       .       . 
.        .       .       . 

我正在尝试转置数据,以便 v1 成为我的 colnames 并且它们也被堆叠。我熟悉本机转置命令t() 并将列名分配为第一行。但是,我不确定如何堆叠行。我确实分解了每组转置的行(以三个为单位),然后将它们绑定在一个循环中,但它非常慢,因为我的数据集是 1gb。

var1   var2  var3
ad     sa     4
b1     b2     b3
5      6      2
b4     b5     b6
.      .      .
.      .      .
.      .      .

感谢您的帮助!

【问题讨论】:

  • 您应该能够使用tidyr::spreadreshape2::dcast(搜索类似“数据长到宽”的内容),但您可能需要首先创建一个id 列来标识哪个行一起去。如果您的行按您想要的方式排序,可能就像0:(nrow(your_data) - 1) %/% 3 一样简单。

标签: r


【解决方案1】:

reshape2 中的 recast 函数非常适合此功能。但在使用它之前,您需要将index-column 转换为更好的分组变量:

# transform 'index' into a grouping variable
dat$index <- cumsum(c(0, head(dat$index, -1) > tail(dat$index, -1)))

# reshape into the new format
library(reshape2)
recast(dat, variable + index ~ v1, id.var = c('v1','index'))[,3:5]

现在您的数据如下所示:

  var1 var2 var3
1   ad   sa    4
2    5    6    2
3   b1   b2   b3
4   b4   b5   b6

【讨论】:

  • 谢谢!我想错了,但重铸后我仍然可以排序,结果会完全一样。
猜你喜欢
  • 2023-01-11
  • 1970-01-01
  • 2017-07-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-01-16
  • 2019-04-11
相关资源
最近更新 更多