r - 在 R 中,拆分数据帧,以便子集数据帧包含前一个数据帧的最后一行和后续数据帧的第一行

标签 r dataframe subset

关于如何拆分数据帧有很多答案,例如 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/

相关文章:

python - 在 Jupyter Python Notebook 中显示所有数据框列

通过两个不同列中的两个条件删除 R 中的列

python - R、Python、rpy2 : "Error: cannot allocate vector of size xxx Mb"

r - Caret - 基于多个变量创建分层数据集

r - 从开放式问卷中汇总和映射观察结果

Python Pandas 对齐单元格中的文本

r - 如何在 R 中返回错误消息?

r - 如何将一行中的每个元素除以相应的行值?

algorithm - 选择锦标赛的最佳球员(团队)子集

Java,一个集合上的多个迭代器,删除适当的子集和 ConcurrentModificationException