如何在R数据框中提取'I'所在行的前后行值?
解决方案
先针对你的需求给出具体的R代码实现,同时补充其他可行的整理方法:
基础base R方法
- 定位所有'I'的行索引
用which()函数直接获取所有匹配'I'的行位置:
Obs<-c('C','I','M','M','I','M','C') df<- data.frame(Obs) # 获取所有'I'的行索引 i_pos <- which(df$Obs == 'I')
- 提取'I'的前一行值
通过索引偏移获取前一行,同时加入边界判断避免越界(比如第一行就是'I'的情况不会报错):
Before <- df$Obs[i_pos - 1][i_pos - 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
相关产品推荐
相关产品推荐

