将数据框中唯一值转换为二进制参考矩阵的高效实现方法
高效转换数据集为二进制参考矩阵的方法
原始数据集
R代码定义
ID_TRIAL <- c(1,1,1,2,3,4,5,5,5,6,6,6,7,7,8,8,8,8) TYPE_FAIL <- c("A","B","C","F","A","A","A","B","K","T","F","A","A","B","B","Q","P","I")
原始表格
| ID TRIAL | TYPE_FAIL |
|---|---|
| 1 | A |
| 1 | B |
| 1 | C |
| 2 | F |
| 3 | A |
| 4 | A |
| 5 | A |
| 5 | B |
| 5 | K |
| 6 | T |
| 6 | F |
| 6 | A |
| 7 | A |
| 7 | B |
| 8 | B |
| 8 | Q |
| 8 | P |
| 8 | I |
转换需求
需将数据集转换为二进制参考矩阵:
- 列按
TYPE_FAIL的字母顺序排列(排序后为:A B C F I K P Q T) - 行对应每个唯一的
ID_TRIAL,用1表示该TYPE_FAIL在对应试验中出现,0表示未出现
示例(试验8对应的行):
| A | B | C | F | I | K | P | Q | T |
|---|---|---|---|---|---|---|---|---|
| 0 | 1 | 0 | 0 | 1 | 0 | 1 | 1 | 0 |
期望输出矩阵
| TRIAL | A | B | C | F | I | K | P | Q | T |
|---|---|---|---|---|---|---|---|---|---|
| 1 | 1 | 1 | 1 | 0 | 0 | 0 | 0 | 0 | 0 |
| 2 | 0 | 0 | 0 | 1 | 0 | 0 | 0 | 0 | 0 |
| 3 | 1 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
| 4 | 1 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
| 5 | 1 | 1 | 0 | 0 | 0 | 1 | 0 | 0 | 0 |
| 6 | 1 | 0 | 0 | 1 | 0 | 0 | 0 | 0 | 1 |
| 7 | 1 | 1 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
| 8 | 0 | 1 | 0 | 0 | 1 | 0 | 1 | 1 | 0 |
高效实现方法
方法1:基础R内置函数实现
利用xtabs()生成交叉表,全程向量化操作,效率远高于循环/多段ifelse:
# 生成交叉表,自动按因子水平排序 cross_tab <- xtabs(~ ID_TRIAL + TYPE_FAIL) # 转换为数据框 result_df <- as.data.frame.matrix(cross_tab) # 将计数转为二进制1/0 result_df[] <- ifelse(result_df > 0, 1, 0) # 添加TRIAL列并调整列顺序 result_df$TRIAL <- rownames(result_df) result_df <- result_df[, c("TRIAL", sort(colnames(result_df)[-ncol(result_df)]))] rownames(result_df) <- NULL # 输出结果 print(result_df)
方法2:tidyverse框架实现
适合熟悉tidyverse语法的用户,同样采用高效向量化操作:
library(dplyr) library(tidyr) result_df <- tibble(ID_TRIAL, TYPE_FAIL) %>% distinct() %>% # 去重确保每个试验-故障组合唯一 mutate(value = 1) %>% pivot_wider( names_from = TYPE_FAIL, values_from = value, values_fill = 0, names_sort = TRUE # 自动按字母顺序排列列 ) %>% rename(TRIAL = ID_TRIAL) # 输出结果 print(result_df)
内容的提问来源于stack exchange,提问作者R_Student
相关产品推荐
相关产品推荐

