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

如何在R数据框中提取'I'所在行的前后行值?

解决方案

先针对你的需求给出具体的R代码实现,同时补充其他可行的整理方法:

基础base R方法

  1. 定位所有'I'的行索引
    用which()函数直接获取所有匹配'I'的行位置:
Obs<-c('C','I','M','M','I','M','C')
df<- data.frame(Obs)

# 获取所有'I'的行索引
i_pos <- which(df$Obs == 'I')
  1. 提取'I'的前一行值
    通过索引偏移获取前一行,同时加入边界判断避免越界(比如第一行就是'I'的情况不会报错):
Before <- df$Obs[i_pos - 1][i_pos - 1 >= 1]
  1. 提取'I'的后一行值
    同理,偏移索引并判断不超过数据框总行数:
After <- df$Obs[i_pos + 1][i_pos + 1 <= nrow(df)]

运行后结果:

  • Before为c("C", "M")
  • After为c("M", "M")

dplyr包便捷处理法

如果习惯tidyverse风格的代码,用dplyr的lag()和lead()可以直接提取前后行值,再筛选目标行:

library(dplyr)

# 生成包含前后行值的结果框,再筛选出'I'的记录
result_df <- df %>%
  mutate(
    Before = lag(Obs),  # 取当前行的前一行值
    After = lead(Obs)   # 取当前行的后一行值
  ) %>%
  filter(Obs == 'I')

# 提取所需集合
Before_dplyr <- result_df$Before
After_dplyr <- result_df$After

这种方法能保留完整的记录关联,方便后续进一步分析。

关于match函数的说明

match()仅返回第一个匹配项的位置,无法获取所有'I'的索引,因此不适合你的需求,which()才是正确选择。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.28 21:12:52