在R语言中将宽表转换为含Group与answer列的长表的方法咨询
解决方法
你用cbind生成的dtTest是矩阵类型,这大概率是你用melt或data.table操作出错的核心原因,先把它转换成数据框/数据表再处理即可。下面提供几种可行的实现方式:
方法1:使用tidyverse工具(dplyr + tidyr)
# 加载依赖包 library(tidyverse) # 转换格式并整理成目标结构 dtTest_df <- as.data.frame(dtTest) %>% pivot_longer(cols = everything(), names_to = "Group", # 将原列名映射为Group列 values_to = "answer") %>% # 将原数值映射为answer列 mutate(answer = ifelse(answer == 1, "yes", "no")) # 把0/1替换为no/yes
方法2:使用data.table的melt函数
library(data.table) # 转换为data.table格式 dtTest_dt <- as.data.table(dtTest) # 执行融化操作 melted_dt <- melt(dtTest_dt, measure.vars = names(dtTest_dt), variable.name = "Group", value.name = "answer") # 替换数值为文本标签 melted_dt[, answer := fifelse(answer == 1, "yes", "no")]
方法3:Base R原生实现
# 先转成数据框 dtTest_df <- as.data.frame(dtTest) # 生成Group列和原始answer列数据 group_col <- rep(names(dtTest_df), each = nrow(dtTest_df)) answer_col <- as.vector(dtTest_df) # 组合成目标数据框并替换值 result_df <- data.frame(Group = group_col, answer = ifelse(answer_col == 1, "yes", "no"))
额外提示
- 替换值时也可以用因子类型转换:
factor(answer, levels = c(0,1), labels = c("no", "yes")),生成的因子型变量更适合后续统计分析。 - 若之前直接对矩阵执行
melt,会因矩阵的结构特性触发报错,所以第一步的格式转换是关键。
内容的提问来源于stack exchange,提问作者Nneka
相关产品推荐
相关产品推荐

