R语言如何按条件将no_rows<2的行的value替换为前组对应值
问题核心原因
你之前用dplyr实现不符合预期的核心原因是错误对group列做了分组,lag()函数在分组内只能取同组的上一行值,无法跨组获取前一个分组的有效值。
优化实现方案
以下两种方案均为向量化运算,相比逐行遍历的for循环性能提升显著,数据量越大优势越明显:
方案1:tidyverse生态实现(dplyr+tidyr)
适合日常分析场景,代码可读性高:
library(dplyr) library(tidyr) df_end <- df %>% # 将需要替换的行的value标记为缺失值 mutate(value = ifelse(no_rows < 2, NA, value)) %>% # 用前一个非缺失的value向下填充所有缺失值 fill(value, .direction = "down")
方案2:data.table实现
适合超大数据量场景,运算速度最快:
library(data.table) # 转换为data.table格式 setDT(df) # 先标记需要替换的行为缺失值,再向前填充缺失值 df[no_rows < 2, value := NA][, value := nafill(value, type = "locf")]
两种方案运行结果都和你给出的预期输出完全一致。
内容的提问来源于stack exchange,提问作者Pixie
相关产品推荐
相关产品推荐

