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", "G4", "G4", "G4", "G4"),
  Number = c(1, NA, NA, NA, 1, NA, NA, NA, 1, 2, 3, NA, 1, NA, NA, NA),
  Letter = c("A", "B", "X", "D", "A", "B", "C", "X", "A", "B", "C", "X", "D", "E", "F", "X")
)

转换规则

按分组执行以下逻辑:

  • 若分组内存在Letter = "X":
    • 若X的前一行Letter为"F",整个分组保持不变(如G4)
    • 否则,将X之前所有Number为NA的行的Letter改为"U"
  • Number不为NA的行、Letter = "X"的行、X之后的行均保持原样

实现代码

使用dplyr的分组操作完成转换:

df_transformed <- df %>%
  group_by(Group) %>%
  mutate(
    # 定位分组内X的行位置
    x_row = which(Letter == "X"),
    # 判断是否需要跳过当前分组的转换
    skip_group = ifelse(length(x_row) > 0 & x_row > 1 & Letter[x_row - 1] == "F", TRUE, FALSE),
    # 标记需要替换Letter的行:在X之前、Number为NA、且不跳过分组
    replace_flag = ifelse(skip_group, FALSE, row_number() < x_row & is.na(Number))
  ) %>%
  # 替换符合条件的Letter值
  mutate(Letter = ifelse(replace_flag, "U", Letter)) %>%
  # 移除临时辅助列并取消分组
  select(-x_row, -skip_group, -replace_flag) %>%
  ungroup()

转换结果

运行代码后得到目标数据框:

print(df_transformed)
#> # A tibble: 16 × 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     
#> 13 G4         1 D     
#> 14 G4        NA E     
#> 15 G4        NA F     
#> 16 G4        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.06 10:15:27