R语言按双变量分组依据rank范围生成type字段的实现问题
R按ID分组生成多列类型标识的实现方案
原始示例数据
数据构造代码:
DF<-data.frame(id=c("A1","A1","A1","B2","B2","B2"), rank=c("1","2","3","1","2","3"), code=c("A","B","B","B","B","A"))
原始数据预览:
| id | rank | code |
|---|---|---|
| A1 | 1 | A |
| A1 | 2 | B |
| A1 | 3 | B |
| B2 | 1 | B |
| B2 | 2 | B |
| B2 | 3 | A |
实现规则(按id分组计算)
- type1:取当前id下rank=1的code值转小写重复2次,仅rank=1的行展示该值,其余行填充NA
- type2:取当前id下rank为1、2的code值,若两个值不同则填充
MIX,若相同则转小写重复2次,仅rank≤2的行展示值,其余行填充NA - type3:取当前id下rank为1-3的全部code值,若存在不同值则填充
MIX,所有行均展示该值
实现代码
使用dplyr实现逻辑最简洁:
library(dplyr) result <- DF %>% group_by(id) %>% mutate( # 计算type1 type1 = ifelse(rank == 1, paste0(rep(tolower(code[rank == 1]),2), collapse = ""), NA), # 计算type2 type2 = { code_12 <- code[rank %in% c("1","2")] val <- ifelse(length(unique(code_12)) == 1, paste0(rep(tolower(unique(code_12)),2), collapse = ""), "MIX") ifelse(rank %in% c("1","2"), val, NA) }, # 计算type3 type3 = ifelse(length(unique(code)) == 1, paste0(rep(tolower(unique(code)),2), collapse = ""), "MIX") ) %>% ungroup()
输出结果
和预期完全一致:
| id | rank | code | type1 | type2 | type3 |
|---|---|---|---|---|---|
| A1 | 1 | A | aa | MIX | MIX |
| A1 | 2 | B | NA | MIX | MIX |
| A1 | 3 | B | NA | NA | MIX |
| B2 | 1 | B | bb | bb | MIX |
| B2 | 2 | B | NA | bb | MIX |
| B2 | 3 | A | NA | NA | MIX |
内容的提问来源于stack exchange,提问作者hklovs
相关产品推荐
相关产品推荐

