关于如何拆分数据帧有很多答案,例如 How to split a data frame?

但是,我想拆分一个数据帧,以便较小的数据帧包含前一个数据帧的最后一行和下一个数据帧的第一行。

这是一个例子

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

我希望输出看起来像:
 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

完成此任务的有效方法是什么?

最佳答案

假设 DF 是原始 data.frame,具有 ngroup 列的那个。令 nDF 中的行数。现在定义一个函数 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

关于r - 在 R 中,拆分数据帧,以便子集数据帧包含前一个数据帧的最后一行和后续数据帧的第一行,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/33789627/

10-13 08:36