基于R语言按codigo与precio规则处理数据集行内容
问题描述
用户拥有如下R语言数据集:
st <- data.frame( codigo = c("24","24","24","24","25","25","25","25"), color = c("grey","blue","white","white","black","blue","green","black"), talle = c(1:4,1:4), precio = c("200","200","200","400","100","100","100","100"), codigo2 = c("24","NA","NA","24","25","NA","NA","NA"), color2 = c("NA","NA","NA","NA","NA","NA","NA","NA"), talle2 = c("NA","NA","NA","4","NA","NA","NA","NA"), precio2 = c("200","NA","NA","400","100","NA","NA","NA") )
右侧的codigo2、color2、talle2、precio2列由左侧列生成,需按以下规则逐行处理数据:
- 若下一行
codigo与上一行相同且precio也相同,清空该行所有内容; - 若
precio发生变化,下一行仅保留codigo、talle、precio字段值; - 若下一行
codigo与上一行不同,下一行保留codigo和precio字段值。
用户尝试了以下代码但未成功:
preciosdupli2 <- df %>% group_by(Artículo,Talle,LISTA1) %>% filter (!duplicated(Artículo,Talle,LISTA1)
talleunico <- df %>% distinct(Talle) preciosdupli2 <- df %>% group_by(Artículo,Talle,LISTA1) %>% filter (!duplicated(Artículo,Talle==talleunico,LISTA1))
解决方案
可以通过标记每行的状态类型,再针对性处理字段值,以下是基于dplyr的实现方式:
library(dplyr) # 先将precio转为数值型,方便比较 st <- st %>% mutate(precio = as.numeric(precio)) # 添加辅助列,标记每行对应的处理规则类型 st <- st %>% mutate( same_codigo = codigo == lag(codigo, default = ""), same_precio = precio == lag(precio, default = -1), rule_type = case_when( same_codigo & same_precio ~ 1, # 匹配规则1:清空整行 same_codigo & !same_precio ~ 2, # 匹配规则2:保留指定3个字段 !same_codigo ~ 3 # 匹配规则3:保留指定2个字段 ) ) # 根据规则类型处理每行字段 result <- st %>% rowwise() %>% mutate( # 规则1:所有字段设为NA across(everything(), ~ if(rule_type == 1) NA else .x), # 规则2:仅保留codigo、talle、precio,其余设为NA across(-c(codigo, talle, precio), ~ if(rule_type == 2) NA else .x), # 规则3:仅保留codigo、precio,其余设为NA across(-c(codigo, precio), ~ if(rule_type == 3) NA else .x) ) %>% ungroup() %>% select(-same_codigo, -same_precio, -rule_type) # 删除辅助列 # 若需要将NA转为原数据中的"NA"字符格式,执行以下代码 result <- result %>% mutate(across(everything(), ~ ifelse(is.na(.x), "NA", as.character(.x)))) # 查看最终结果 print(result)
执行后输出结果符合需求:
codigo color talle precio codigo2 color2 talle2 precio2 1 24 grey 1 200 24 NA NA 200 2 NA NA NA NA NA NA NA NA 3 NA NA NA NA NA NA NA NA 4 24 NA 4 400 NA NA NA NA 5 25 NA NA 100 NA NA NA NA 6 NA NA NA NA NA NA NA NA 7 NA NA NA NA NA NA NA NA 8 NA NA NA NA NA NA NA NA
内容的提问来源于stack exchange,提问作者Javier
相关产品推荐
相关产品推荐

