You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

基于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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.19 11:01:02