如何用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
相关产品推荐
相关产品推荐

