在R中如何提取dataframe首行及指定列值发生变化的行?
问题原因
你原来的代码存在两个核心问题:
dplyr::lag()对数据集第一行计算会返回NA,和原值做!=比较结果仍为NA,which()会自动忽略NA对应的索引,所以你最终的结果里本来就没有包含首行。- 直接用
!=比较如果列中存在NA值,会导致判断逻辑错误(比如两列都是NA的情况本应判定为值未变化,但NA != NA会返回NA,不会被which正常识别)。
修复方案
这里提供两种可选的实现方式,都能满足需求:
方案1:极简实现(推荐)
直接判断A/B/C/D四列的组合是否为第一次出现,一步得到结果:
df_new <- df[!duplicated(paste(df$A, df$B, df$C, df$D)), ]
这个方法自动保留首行,且天然处理NA值的比较问题,不需要额外依赖包。
方案2:基于原有逻辑修改
如果你希望沿用lag的判断逻辑,修改后代码如下:
library(dplyr) # 计算所有存在列变化的行索引 change_rows <- which( (df$A != lag(df$A) | is.na(df$A) != is.na(lag(df$A))) | (df$B != lag(df$B) | is.na(df$B) != is.na(lag(df$B))) | (df$C != lag(df$C) | is.na(df$C) != is.na(lag(df$C))) | (df$D != lag(df$D) | is.na(df$D) != is.na(lag(df$D))) ) # 合并首行和变化行,去重后提取 final_rows <- unique(c(1, change_rows)) df_new <- df[final_rows, ]
内容的提问来源于stack exchange,提问作者nchand
相关产品推荐
相关产品推荐

