如何用循环在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
相关产品推荐
相关产品推荐

