投射有序数据

时间:2014-07-08 17:20:11

标签: r

我设法以以下格式获取数据:

run    type1
data1  12
data2  13
run    type2
data1  14
data2  15
...

我想:

run    data1 data2
type1     12    13
type2     14    15
...

我尝试过施法/播放无济于事。有什么建议吗?

示例数据:

data.frame(matrix(c("run","type1","data1",12,"data2",13,"run","type2","data1",14,"data3",15), ncol=2, byrow=T))

1 个答案:

答案 0 :(得分:2)

这是我的建议:

cast.runs <- function(d) {
  isrun <- d[[1]]=="run"
  whichrun <- which(isrun)
  lens <- diff(c(whichrun, nrow(d)+1))
  runlabels <- inverse.rle(list(lengths=lens, values=d[[2]][whichrun]))
  return(cbind(run=runlabels, d)[!isrun,])
}

此功能将产生合适的长格式,然后您可以根据需要重新制作:

  runlabels    X1 X2
2     type1 data1 12
3     type1 data2 13
5     type2 data1 14
6     type2 data3 15

不出所料,我首先确定了run行。我想每次运行有多少行,包括标题行。该代码的灵感来自this answer。接下来,我多次重复每个运行标签,最后我删除标题行。

投射此输出的一种可能方法是使用dcast包中的reshape2函数:

> dcast(cast.runs(d), run ~ X1)
Using X2 as value column: use value.var to override.
    run data1 data2 data3
1 type1    12    13  <NA>
2 type2    14  <NA>    15