对比数据框前后行并设置条件:diff函数无法满足需求的技术问询
解决数据框指定行与前后行的对比问题
我明白你想要针对数据框里的指定行,对比它和前一行、后一行的数据——diff()函数确实只能计算当前行与前一行的差值,没法满足同时查看前后行对比的需求,这里给你两个实用的方案:
方案1:全局添加前后行数据及差值
用dplyr的lag()(获取前一行数据)和lead()(获取后一行数据)函数,给整个数据框添加上前后行的信息,以及对应的差值,这样你可以随时查看任意行的前后对比:
首先加载dplyr并定义你的测试数据:
library(dplyr) test = data.frame(y1=c(10,22,22,36,36,36,38), y2=c(12,22,18,21,14,17,15))
然后执行以下代码生成对比列:
test <- test %>% mutate( # 提取前一行的y1、y2 prev_y1 = lag(y1), prev_y2 = lag(y2), # 提取后一行的y1、y2 next_y1 = lead(y1), next_y2 = lead(y2), # 计算当前行与前一行的差值 diff_prev_y1 = y1 - prev_y1, diff_prev_y2 = y2 - prev_y2, # 计算当前行与后一行的差值 diff_next_y1 = y1 - next_y1, diff_next_y2 = y2 - next_y2 )
运行后得到的结果会包含所有行的前后数据及差值:
> test y1 y2 prev_y1 prev_y2 next_y1 next_y2 diff_prev_y1 diff_prev_y2 diff_next_y1 diff_next_y2 1 10 12 NA NA 22 22 NA NA -12 -10 2 22 22 10 12 22 18 12 10 0 4 3 22 18 22 22 36 21 0 -4 -14 -3 4 36 21 22 18 36 14 14 3 0 7 5 36 14 36 21 36 17 0 -7 0 -3 6 36 17 36 14 38 15 0 3 -2 2 7 38 15 36 17 NA NA 2 -2 NA NA
方案2:针对指定行直接对比
如果你只需要查看某一行的前后对比,可以直接提取目标行及其前后行的数据,或者计算差值:
比如要查看第3行的前后对比:
# 提取第3行及其前后行 target_row <- 3 test %>% slice((target_row - 1):(target_row + 1))
得到的结果会聚焦在目标行和它的前后邻居:
y1 y2 prev_y1 prev_y2 next_y1 next_y2 diff_prev_y1 diff_prev_y2 diff_next_y1 diff_next_y2 1 22 22 10 12 22 18 12 10 0 4 2 22 18 22 22 36 21 0 -4 -14 -3 3 36 21 22 18 36 14 14 3 0 7
或者直接计算目标行与前后行的差值:
# 前一行与目标行的差值 prev_diff <- test[target_row, c("y1", "y2")] - test[target_row - 1, c("y1", "y2")] # 后一行与目标行的差值 next_diff <- test[target_row + 1, c("y1", "y2")] - test[target_row, c("y1", "y2")] cat("前一行与目标行的差值:\n") print(prev_diff) cat("\n后一行与目标行的差值:\n") print(next_diff)
运行结果:
前一行与目标行的差值: y1 y2 3 0 -4 后一行与目标行的差值: y1 y2 4 14 3
为什么diff函数不适用?
diff()函数返回的是向量中相邻元素的后减前差值,结果长度比原向量少1,只能得到当前行与前一行的差,而且没法直接获取当前行与后一行的对比,也不方便针对指定行做灵活的前后分析,而lag()和lead()可以直接定位前后行的数据,更贴合你的需求。
内容的提问来源于stack exchange,提问作者Alexander
相关产品推荐
相关产品推荐

