如何用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"
- 若X的前一行
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
相关产品推荐
相关产品推荐

