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

如何用dplyr在R数据框组内按三个条件转换值?

在R中使用dplyr实现指定的数据框转换需求

原始数据

首先构造你的原始数据框:

library(dplyr)

df <- tibble(
  Group = c("G1", "G1", "G1", "G1", "G2", "G2", "G2", "G2", "G3", "G3", "G3", "G3"),
  Number = c(1, NA, NA, NA, 1, NA, NA, NA, 1, 2, 3, NA),
  Letter = c("A", "B", "X", "D", "A", "B", "C", "X", "A", "B", "C", "X")
)

转换需求

  • 每个组内,若某行Letter为"X",则该行之前所有Number为NA的行,Letter改为"U"
  • 若之前行的Number有非NA值,保持原Letter不变
  • Letter为"X"的行本身不修改

实现代码

使用dplyr按组处理,逻辑清晰:

df_transformed <- df %>%
  group_by(Group) %>%
  mutate(
    # 定位每个组内第一个"X"的行号
    x_first_pos = which(Letter == "X")[1],
    # 标记需要修改的行:在第一个X之前、Number为NA、且当前行不是X
    need_update = row_number() < x_first_pos & is.na(Number) & Letter != "X",
    # 执行修改
    Letter = ifelse(need_update, "U", Letter)
  ) %>%
  # 清理临时辅助列
  select(-x_first_pos, -need_update) %>%
  ungroup()

转换结果

运行后得到符合要求的数据框:

print(df_transformed)
#> # A tibble: 12 × 3
#>    Group Number Letter
#>    <chr>  <dbl> <chr> 
#>  1 G1        1 A     
#>  2 G1       NA U     
#>  3 G1       NA X     
#>  4 G1       NA D     
#>  5 G2        1 A     
#>  6 G2       NA U     
#>  7 G2       NA U     
#>  8 G2       NA X     
#>  9 G3        1 A     
#> 10 G3        2 B     
#> 11 G3        3 C     
#> 12 G3       NA X

内容的提问来源于stack exchange,提问作者Cam

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.08 08:45:31