根据空行拆分 R 中的数据帧

ari*_*arm 1 r

我有一个包含多个表的数据框,每个表由之间的空行表示。

A   x   y   z
Name1   12  21  23
Name2   23  21  22
Name3   45  43  21

B   x   y   z
Name4   32  23  23
Name5   12  32  33
Name6   10  34  45
Name12  11  11  56

C   x   y   z
Name7   11  56  67
Name8   90  87  98
Name9   45  34  34
Name10  78  8   56
Name11  92  12  45
Run Code Online (Sandbox Code Playgroud)

现在我想把这个数据框分成多个表,因此我需要分别A、B和C 3个表。

如何在 R 中执行此操作

sin*_*eso 5

如果可能的话,您应该看看是否可以修改导入数据的方式,从而不必这样做。否则,这是一个可能的解决方案,它创建一个列表,其中每个元素都是您的表之一。

dt <- read.table(blank.lines.skip = FALSE,
                 text = "
A   x   y   z
Name1   12  21  23
Name2   23  21  22
Name3   45  43  21

B   x   y   z
Name4   32  23  23
Name5   12  32  33
Name6   10  34  45
Name12  11  11  56

C   x   y   z
Name7   11  56  67
Name8   90  87  98
Name9   45  34  34
Name10  78  8   56
Name11  92  12  45
", stringsAsFactors = FALSE)

## add column to indicate groups
dt$tbl_id <- cumsum(!nzchar(dt$V1))

## remove blank lines
dt <- dt[nzchar(dt$V1), ]

## split the data frame
dt_s <- split(dt[, -ncol(dt)], dt$tbl_id)

## use first line as header and reset row numbers
dt_s <- lapply(dt_s, function(x) {
    colnames(x) <- x[1, ]
    x <- x[-1, ]
    rownames(x) <- NULL
    x
})
Run Code Online (Sandbox Code Playgroud)

结果:

> dt_s
$`1`
      A  x  y  z
1 Name1 12 21 23
2 Name2 23 21 22
3 Name3 45 43 21

$`2`
       B  x  y  z
1  Name4 32 23 23
2  Name5 12 32 33
3  Name6 10 34 45
4 Name12 11 11 56

$`3`
       C  x  y  z
1  Name7 11 56 67
2  Name8 90 87 98
3  Name9 45 34 34
4 Name10 78  8 56
5 Name11 92 12 45
Run Code Online (Sandbox Code Playgroud)