R语言如何忽略C值、用上一行取值填充指定列空单元格
实现逻辑
你要的填充规则可以拆解为遍历V2列,遇到空值时校验上一行的取值:如果上一行取值不是C,就用上一行的值填充当前空单元格;如果上一行取值是C,当前空单元格保持为空即可。
基础R实现代码
不需要加载任何第三方包,直接通过循环处理:
df <- data.frame( 'ID' = c(1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23) ,'V1' = c("desc1", "desc2", "desc3", "desc4", "desc5", "desc6", "desc7", "desc8", "desc9", "desc10", "desc11", "desc12", "desc13", "desc14", "desc15", "desc16", "desc17", "desc18", "desc19", "desc20", "desc21", "desc22", "desc23") ,'V2' =c("A", "", "", "B", "", "", "", "C", "", "A", "", "", "", "B", "", "", "C", "", "A", "B", "", "C", "")) # 填充处理 for (i in 2:nrow(df)) { if (df$V2[i] == "" && df$V2[i-1] != "C") { df$V2[i] <- df$V2[i-1] } }
tidyverse 简洁实现
如果你习惯用dplyr语法,可以用分组填充的方式实现:
library(dplyr) df <- df %>% mutate( V2 = na_if(V2, ""), # 生成独立填充分组:遇到新的非空值、或者上一行是C时拆分新组 fill_grp = cumsum(!is.na(V2) | lag(V2, default = "") == "C") ) %>% group_by(fill_grp) %>% mutate(V2 = first(V2)) %>% ungroup() %>% select(-fill_grp)
输出验证
处理后的V2列取值如下,完全符合预期规则:"A","A","A","B","B","B","B","C","","A","A","A","A","B","B","B","C","","A","B","B","C",""
内容的提问来源于stack exchange,提问作者Farshid Owrang
相关产品推荐
相关产品推荐

