在R中如何将DataFrame转换为指定格式的二元特征
问题描述
我有如下R语言DataFrame:
# 示例数据构造 participants <- c("A", "A", "A", "B", "C", "C") answers <- c("alpha", "beta", "gamma", "beta", "beta", "gamma") df <- data.frame(participants, answers)
数据预览:
participants answers 1 A alpha 2 A beta 3 A gamma 4 B beta 5 C beta 6 C gamma
其中answers列的实际取值远多于示例中的范围。我想要将其转换为如下的二元特征格式:
participants answers value 1 A alpha 1 2 A beta 1 3 A gamma 1 4 B alpha 0 5 B beta 1 6 B gamma 0 7 C alpha 0 8 C beta 1 9 C gamma 1
我猜测需要先获取answers和participants的levels,但不清楚后续操作,请问该如何实现?
实现方案
你的思路是正确的,核心逻辑是先生成所有参与者和所有答案的全组合,再将原表中存在的组合标记为1、不存在的标记为0即可,两种常用实现方式如下:
方法1:tidyverse 实现(代码简洁,兼容性强)
无需手动枚举answers取值,可自动适配任意数量的答案分类:
library(tidyverse) result <- df %>% # 生成参与者和答案的全量笛卡尔组合 expand(participants, answers) %>% # 关联原表标记存在的记录 left_join(mutate(df, value = 1), by = c("participants", "answers")) %>% # 未匹配到的记录填充为0 replace_na(list(value = 0))
方法2:base R 实现(无需加载第三方包)
# 提取所有唯一参与者、唯一答案 all_participants <- unique(df$participants) all_answers <- unique(df$answers) # 生成全组合数据框 full_df <- expand.grid(participants = all_participants, answers = all_answers) # 匹配原表生成二元标记 full_df$value <- as.integer(interaction(full_df) %in% interaction(df))
内容的提问来源于stack exchange,提问作者SuperDuperMario
相关产品推荐
相关产品推荐

