有关如何拆分数据帧的答案有很多,例如如何拆分数据框?
但是,我想拆分一个数据帧,以便较小的数据帧包含前一个数据帧的最后一行和下一个数据帧的第一行.
这是一个例子
n <- 1:9
group <- rep(c("a","b","c"), each = 3)
data.frame(n = n, group)
n group
1 1 a
2 2 a
3 3 a
4 4 b
5 5 b
6 6 b
7 7 c
8 8 c
9 9 c
Run Code Online (Sandbox Code Playgroud)
我希望输出看起来像:
d1 <- data.frame(n = 1:4, group = c(rep("a",3),"b"))
d2 <- data.frame(n = 3:7, group = c("a",rep("b",3),"c"))
d3 <- data.frame(n = 6:9, group = c("b",rep("c",3)))
d <- list(d1, d2, d3)
d
[[1]]
n group
1 1 a
2 2 a
3 3 a
4 4 b
[[2]]
n group
1 3 a
2 4 b
3 5 b
4 6 b
5 7 c
[[3]]
n group
1 6 b
2 7 c
3 8 c
4 9 c
Run Code Online (Sandbox Code Playgroud)
什么是完成此任务的有效方法?
假设DF是原始的data.frame,有列n和group.让我们n在的行数DF.现在定义一个extract给定索引序列的函数,ix将其放大到包括第一个之前和之后的那个,然后返回那些行DF.现在我们已经定义了extract,按组拆分向量1,...,n并应用于extract拆分的每个组件.
n <- nrow(DF)
extract <- function(ix) DF[seq(max(1, min(ix) - 1), min(n, max(ix) + 1)), ]
lapply(split(seq_len(n), DF$group), extract)
$a
n group
1 1 a
2 2 a
3 3 a
4 4 b
$b
n group
3 3 a
4 4 b
5 5 b
6 6 b
7 7 c
$c
n group
6 6 b
7 7 c
8 8 c
9 9 c
Run Code Online (Sandbox Code Playgroud)