R语言数据框处理:根据同一ID下的不同code值生成type列
实现方案:为R语言数据框按id分组生成type列
没问题,这里有两种实用的实现方案,帮你快速生成符合规则的type列:
方法一:使用dplyr(tidyverse生态)
这是数据分析中最常用的分组处理方式,代码可读性高,逻辑清晰:
# 加载dplyr包(如果未安装先运行 install.packages("dplyr")) library(dplyr) # 定义原始数据框 DF <- data.frame(id=c(1,1,2,3,3),code=c("1","0","1","0","0")) # 分组生成type列 DF <- DF %>% group_by(id) %>% # 按id进行分组 mutate( type = case_when( all(code == "1") ~ "A", # 组内code全为1时标记A all(code == "0") ~ "B", # 组内code全为0时标记B TRUE ~ "mix" # 其余情况(同时有1和0)标记mix ) ) %>% ungroup() # 取消分组,恢复普通数据框结构 # 查看结果 print(DF)
运行后会得到你期望的输出:
# A tibble: 5 × 3 id code type <dbl> <chr> <chr> 1 1 1 mix 2 1 0 mix 3 2 1 A 4 3 0 B 5 3 0 B
方法二:使用Base R(无需额外安装包)
如果你不想加载第三方包,用Base R也能轻松实现:
# 定义原始数据框 DF <- data.frame(id=c(1,1,2,3,3),code=c("1","0","1","0","0")) # 1. 按id分组,获取每个组的code唯一值 group_unique_codes <- tapply(DF$code, DF$id, unique) # 2. 根据每组的唯一值生成对应的type标记 type_mapping <- sapply(group_unique_codes, function(codes) { if (all(codes == "1")) "A" else if (all(codes == "0")) "B" else "mix" }) # 3. 将type标记匹配到原数据框的每一行 DF$type <- type_mapping[as.character(DF$id)] # 查看结果 print(DF)
补充说明
- 你的
code列是字符类型(存储为"1"/"0"),所以代码中用字符值进行判断。如果后续需要将code转为数值类型(1/0),只需把判断条件里的"1"/"0"改成1/0即可。 - 两种方法都能完美匹配你要求的规则,可根据自己的代码习惯选择。
内容的提问来源于stack exchange,提问作者hklovs
相关产品推荐
相关产品推荐

