You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

将数据框中唯一值转换为二进制参考矩阵的高效实现方法

高效转换数据集为二进制参考矩阵的方法

原始数据集

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 TRIALTYPE_FAIL
1A
1B
1C
2F
3A
4A
5A
5B
5K
6T
6F
6A
7A
7B
8B
8Q
8P
8I

转换需求

需将数据集转换为二进制参考矩阵:

  • 列按TYPE_FAIL的字母顺序排列(排序后为:A B C F I K P Q T)
  • 行对应每个唯一的ID_TRIAL,用1表示该TYPE_FAIL在对应试验中出现,0表示未出现

示例(试验8对应的行):

ABCFIKPQT
010010110

期望输出矩阵

TRIALABCFIKPQT
1111000000
2000100000
3100000000
4100000000
5110001000
6100100001
7110000000
8010010110

高效实现方法

方法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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.22 19:15:12