如何在Excel或R中将数据集转换为存在性二进制矩阵?
Excel实现方法
- 拆分原始数据
- 假设原始数据存放在A列(A1:A3),选中A列后点击「数据」选项卡的「分列」功能,选择「分隔符号」并勾选「空格」,完成后RowX会保留在A列,后续的字母会被拆分到B、C等列中。
- 提取唯一字母作为表头
- 将B列及后续所有分散的字母复制到新区域,通过「数据」→「删除重复值」得到唯一的字母集合(A、B、C、D、E),把这些字母作为新表格的表头(比如从F1单元格开始排列)。
- 生成0/1标记矩阵
- 在F2单元格输入公式:
=IF(ISNUMBER(MATCH(F$1,$B2:$D2,0)),1,0),回车后向右、向下填充公式即可完成标记。 - 也可使用COUNTIF简化公式:
=--(COUNTIF($B2:$D2,F$1)>0),其中--用于将布尔结果转换为0/1数值。
- 在F2单元格输入公式:
R实现方法
方法1:tidyverse工具链(推荐,代码直观易维护)
# 加载工具包 library(tidyverse) # 模拟原始数据结构 raw_data <- tibble(row_id = c("Row1", "Row2", "Row3"), content = c("A D", "B C", "A C E")) # 转换为目标格式 target_data <- raw_data %>% separate_rows(content, sep = " ") %>% # 将每行的字母拆分为单独行 mutate(flag = 1) %>% # 标记存在的字母为1 pivot_wider(names_from = content, values_from = flag, values_fill = 0) # 转换为宽表,缺失值补0 print(target_data)
运行后输出:
# A tibble: 3 × 6 row_id A B C D E <chr> <dbl> <dbl> <dbl> <dbl> <dbl> 1 Row1 1 0 0 1 0 2 Row2 0 1 1 0 0 3 Row3 1 0 1 0 1
方法2:基础R实现(无需额外安装包)
# 模拟原始数据 row_names <- c("Row1", "Row2", "Row3") value_lists <- strsplit(c("A D", "B C", "A C E"), " ") # 生成交叉计数表 cross_table <- table(rep(row_names, lengths(value_lists)), unlist(value_lists)) # 转换为数据框格式 target_df <- as.data.frame.matrix(cross_table) print(target_df)
输出结果与上述方法一致,行名为Row1/Row2/Row3,列名为A-E,单元格值为0或1。
内容的提问来源于stack exchange,提问作者Focus C
相关产品推荐
相关产品推荐

