基于空行拆分R中的数据帧

时间:2017-10-29 12:53:31

标签: 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

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

如何在R

中执行此操作

1 个答案:

答案 0 :(得分:2)

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

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
})

结果:

> 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