我有一个包含多个表的数据框,每个表都由中间的空行表示。
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
中执行此操作答案 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