You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用循环在R语言数据框中提取x2分组的最后一行数据?

R语言提取分组最后一行(循环实现)

问题说明

给定如下示例数据框:

data <- data.frame(x1 = 1:9, 
                   x2 = c("a","a","a",'b','b','c','d','d','e'),
                   x3 = c(4, 1, 9, 0, 1, 2, 3, 8, 4))

需要通过for/while循环遍历每行的x2列,当该行的下一行x2值与当前行不同时,提取当前行存入新数据框,即提取每个x2分组的最后一行。

实现方法

1. for循环实现

# 初始化空数据框存储结果
result <- data.frame()

# 获取数据框总行数
n <- nrow(data)

# 遍历每一行
for (i in 1:n) {
  # 判断当前行是否为分组最后一行(最后一行本身或下一行x2值不同)
  if (i == n || data$x2[i] != data$x2[i+1]) {
    result <- rbind(result, data[i, ])
  }
}

# 查看最终结果
print(result)

运行后输出的目标数据框:

x1 x2 x3
3  3  a  9
5  5  b  1
6  6  c  2
8  8  d  8
9  9  e  4

2. while循环实现

# 初始化空数据框和起始索引
result <- data.frame()
i <- 1
n <- nrow(data)

while (i <= n) {
  current_group_val <- data$x2[i]
  # 定位当前分组的最后一行索引
  last_row_idx <- i
  while (last_row_idx < n && data$x2[last_row_idx + 1] == current_group_val) {
    last_row_idx <- last_row_idx + 1
  }
  # 提取该行存入结果框
  result <- rbind(result, data[last_row_idx, ])
  # 跳转到下一组起始位置
  i <- last_row_idx + 1
}

# 查看最终结果
print(result)

该方法直接定位每个分组的末尾行,减少循环次数,效率更高。

非循环的简洁实现(可选)

如果不需要强制使用循环,R有更高效的分组处理方式,比如用dplyr包:

library(dplyr)

result <- data %>%
  group_by(x2) %>%
  slice_tail(n = 1) %>%
  ungroup()

print(result)

或者用基础R的匹配方法(仅适用于连续分组的情况):

result <- data[match(unique(data$x2), data$x2), ]

内容的提问来源于stack exchange,提问作者gillyp

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.19 10:15:40