我有一个包含多个表的数据框,每个表由之间的空行表示。
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 中执行此操作
如果可能的话,您应该看看是否可以修改导入数据的方式,从而不必这样做。否则,这是一个可能的解决方案,它创建一个列表,其中每个元素都是您的表之一。
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)