如何将调查数据中的多个dummy variables转换为单个factor variable?
把多个Dummy因子变量合并为单个大因子变量的方法
嘿,我明白你的需求啦——把一堆同主题的dummy因子变量(每个都只有"quoted"和"not quoted"两个水平)整合成一个大的因子变量,其中新变量的levels是原来的dummy变量名,值就保留原来的"quoted"/"not quoted"(或者转成0/1)对吧?这在处理调查数据时特别常见,我给你两种实用的R实现方法:
方法一:用tidyverse(推荐,代码更直观)
首先我们先构造一个和你场景匹配的示例数据框,方便你对照:
library(tidyverse) # 模拟你的数据集:包含id和两个dummy因子变量 df <- tibble( id = 1:3, # 假设每条记录有唯一标识 pp_plan_thoughtAWhile = factor(c("quoted", "not quoted", "quoted")), pp_plan_justHappen = factor(c("not quoted", "quoted", "not quoted")) )
接下来用pivot_longer函数把宽格式数据转成长格式,这一步就能直接实现你的需求:
# 转换成长格式,合并dummy变量 df_long <- df %>% pivot_longer( cols = starts_with("pp_plan_"), # 筛选所有以pp_plan_开头的dummy变量 names_to = "statement", # 新的因子变量名,存储原来的dummy变量名 values_to = "response" # 存储原来的quoted/not quoted取值 )
转换后的结果里,statement就是你想要的大因子变量,它的levels就是pp_plan_thoughtAWhile、pp_plan_justHappen这些原dummy变量名;response则保留了每条记录对应陈述的取值。
如果需要把response转成0/1数值,只需要加一步:
df_long <- df_long %>% mutate(response_num = ifelse(response == "quoted", 1, 0))
方法二:用Base R(无需额外安装包)
如果你不想加载tidyverse包,用Base R的stack函数也能实现:
# 提取所有dummy变量并转换 df_base <- stack(df[, grep("pp_plan_", colnames(df))]) # 重命名列名,让结果更清晰 colnames(df_base) <- c("response", "statement") # 同样可以把response转成0/1数值 df_base$response_num <- ifelse(df_base$response == "quoted", 1, 0)
小提示
- 如果你的dummy变量命名规则不是以
pp_plan_开头,你可以用matches()或者直接列名向量来筛选,比如cols = c("pp_plan_thoughtAWhile", "pp_plan_justHappen") - 转换后记得检查
statement是否是因子类型,如果不是可以用as.factor(df_long$statement)转换
内容的提问来源于stack exchange,提问作者DanaDaskalova
相关产品推荐
相关产品推荐

