如何将R语言DataFrame转为宽格式并按规则生成分类列?
R语言实现DataFrame分组转宽及分类标记
完整代码实现
library(dplyr) library(tidyr) # 原始数据 example <- data.frame( PID = c(1091, 1358, 1087, 2358, 2087, 2091), value = c('1','2', '1,4,6', '2', '2', '1') ) # 转宽格式处理 example_wide <- example %>% # 提取PID最后3位作为分组键 mutate(group_key = substr(as.character(PID), nchar(as.character(PID)) - 2, nchar(as.character(PID)))) %>% # 分组内标记A/B group_by(group_key) %>% mutate(id = c("A", "B")) %>% ungroup() %>% # 转换为宽格式 pivot_wider(names_from = id, values_from = c(PID, value)) %>% select(-group_key) # 生成category列 example_solution <- example_wide %>% mutate( category = case_when( (value_A == "1" & value_B == "2") | (value_A == "2" & value_B == "1") ~ "mw", value_A == value_B ~ "mm", TRUE ~ "other" ) ) # 输出结果 print(example_solution)
步骤说明
分组并转宽格式
- 提取PID的最后3位作为分组依据,确保末尾三位相同的PID被分到一组;
- 给每组内的两行分别标记为"A"和"B",用于转宽时生成对应的
PID_A/PID_B、value_A/value_B列; - 通过
pivot_wider完成长格式到宽格式的转换,最后移除临时的分组键列。
按规则生成分类列
- 使用
case_when按优先级判断:- 若value对是1和2的组合(顺序不限),标记为
"mw"; - 若两个value完全相同,标记为
"mm"; - 其余所有情况统一标记为
"other"。
- 若value对是1和2的组合(顺序不限),标记为
- 使用
内容的提问来源于stack exchange,提问作者jo_
相关产品推荐
相关产品推荐

