R语言如何将长格式dataframe转置展开为每行对应单个人员的宽表
实现方法
方法1:使用tidyverse套件(推荐)
你之前转换失败的核心原因是缺少为每个ID下的两条记录生成序列标识的步骤,pivot_wider(原spread的升级版)需要该标识作为列名生成依据,代码如下:
# 加载依赖包 library(tidyverse) # 转换逻辑 df_wanted <- df %>% group_by(ID) %>% # 为同个ID下的记录生成1、2的序号,拼接为Use1、Use2的列名 mutate(use_col = paste0("Use", row_number())) %>% ungroup() %>% # 长表转宽表 pivot_wider(names_from = use_col, values_from = Use) %>% # 将ID列设为行名 column_to_rownames("ID")
运行后输出的df_wanted完全符合预期:
Use1 Use2 Tom F T Ana T F Lena T T
方法2:使用base R实现(无需安装额外包)
如果不想依赖第三方包,可以用base R的reshape函数实现:
# 生成同ID下的序列标识 df$time <- ave(df$ID, df$ID, FUN = seq_along) # 长表转宽表 df_wide <- reshape(df, idvar = "ID", timevar = "time", direction = "wide") # 设置行名并清理多余列 rownames(df_wide) <- df_wide$ID df_wanted <- df_wide[, -1, drop = FALSE] # 修改列名为要求的格式 colnames(df_wanted) <- c("Use1", "Use2")
内容的提问来源于stack exchange,提问作者Lola1993
相关产品推荐
相关产品推荐

