R使用pivot_wider长转宽后list列转常规dataframe数值列求解
R语言长表转宽表异常问题解决方案
问题根因
使用pivot_wider后输出为1行、所有列均为list类型,是因为没有指定用来区分不同行的唯一标识列,函数会默认将同一个variable对应的所有value打包为列表存入同一单元格。
解决方法
方案1:无天然行标识字段时使用
如果原数据集没有被试ID、测量序号这类天然的行归属标识,先给每个variable分组下的观测生成独立行号,再以此为行标识转宽:
library(tidyr) library(dplyr) cfa_model <- cfa_data %>% # 按变量分组,给每个变量下的每条观测生成序号 group_by(variable) %>% mutate(row_id = row_number()) %>% ungroup() %>% # 用生成的行号作为行标识转宽 pivot_wider( id_cols = row_id, names_from = variable, values_from = value ) %>% # 不需要行号列可删除 select(-row_id)
操作后转宽的行数等于所有variable下观测数的最大值,观测不足的位置自动填充NA,所有列均为常规数值/字符向量类型,不会生成list列。如果需要固定输出48行,确保观测数最多的变量刚好有48条记录即可。
方案2:有天然行标识字段时使用
如果原数据本身存在可以标识行归属的字段(比如批次号、被试编号),直接将该字段传入id_cols参数即可,无需额外生成行号:
cfa_model <- pivot_wider( cfa_data, id_cols = 你的行标识字段名, names_from = variable, values_from = value )
内容的提问来源于stack exchange,提问作者Infinito Mágico
相关产品推荐
相关产品推荐

