R语言按ID分组将多行姓名转为多列宽表实现ID去重
解决方案
你可以选择以下两种常用实现方式:
方法1:tidyverse 方案(代码简洁易读)
需要先安装加载dplyr和tidyr包:
library(dplyr) library(tidyr) result <- df %>% group_by(ID) %>% # 给同ID下的姓名按出现顺序生成列名编号 mutate(col_name = paste0("Names_", row_number())) %>% ungroup() %>% # 转换为宽表,缺失值自动填充为空字符串 pivot_wider(names_from = col_name, values_from = Names, values_fill = "")
方法2:基础R方案(无第三方包依赖)
# 按ID拆分所有姓名 name_split <- split(df$Names, df$ID) # 统一每个ID对应的姓名长度为3,不足位补空字符串 name_format <- lapply(name_split, function(x) { length(x) <- 3 x[is.na(x)] <- "" return(x) }) # 合并为最终数据框 result <- data.frame( ID = unique(df$ID), do.call(rbind, name_format) ) # 修改列名符合要求 colnames(result) <- c("ID", "Names_1", "Names_2", "Names_3") # 重置行号 rownames(result) <- NULL
两种方案运行后得到的result和你期望的输出格式完全一致,直接打印即可查看结果。
内容的提问来源于stack exchange,提问作者Valentin Laprie
相关产品推荐
相关产品推荐

