首页 > 解决方案 > 在 R 中重塑分段数据帧

问题描述

如何重塑数据框,其中数据排列在“块”中,宽度为 x 列,长度为 Y 行。在此示例图中,起始数据帧为两个“块”宽和三个“块”长,但该解决方案也应适用于其他维度。最后的“块”可能有更少的行。此数据结构是从此处发布的解决方案中获得的: Split dataframe at specifi row and Arrange columns into "sections" in R

在此处输入图像描述

我尝试使用 reshape() 将其重塑为长格式,但无法弄清楚如何重新排列“块”。

x=2 的样本数据;y=6 和两个“块”宽和两个“块”长:

index v1 index v1
 1    a       7    a
 2    a       8    a
 3    d       9    x
 4    f      10    d
 5    f      11    d
 6    g      12    x
13    e      19    e
14    a      20    e
15    a      21    c
16    d      
17    c      
18    f      

预期输出:

index   v1
1   a
2   a
3   d
4   f
5   f
6   g
7   a
8   a
9   x
10  d
11  d
12  x
13  e
14  a
15  a
16  d
17  c
18  f
19  e
20  e
21  c

标签: r

解决方案


R 代表 wusses。我们只写C。

reblock <- function (data, x, y) {
  cols <- as.list(data) # ncol items, each length nrow
  reblocked <- as.data.frame(matrix(NA, 0, x))
  rn <- names(data)[seq_len(x)]
  names(reblocked) <- rn
  
  while (nrow(data) >= y) {
    rows <- data[seq_len(y), ]
    while (ncol(rows) >= x) {
      names(rows)[seq_len(x)] <- rn
      reblocked <- rbind(reblocked, rows[seq_len(x)])
      rows <- rows[-seq_len(x)]
    }
    # remove x,y block
    data <- data[-seq_len(y), ]
  } 

  reblocked
}

tmp <- data.frame(
         a = rep(1:4, each = 6), 
         b = rep(letters[1:4], each = 6), 
         c = rep(5:8, each = 6), 
         d = rep(letters[5:8], each = 6)
       )
reblock(tmp, 2 ,6)

推荐阅读