R语言:按列最大值复制列并左对齐填充列名的实现需求
按列最大值复制并填充列名的R实现方案
Base R 方案
# 原始数据 df <- data.frame(ID = 1:3, A = c(2, 0, 1), B = c(0, 3, 2)) # 提取除ID外的目标列 target_cols <- setdiff(names(df), "ID") # 初始化结果列表,保留ID列 result_list <- list(df["ID"]) # 遍历每个目标列生成新列 for (col in target_cols) { col_values <- df[[col]] max_count <- max(col_values) # 生成对应数量的新列:当原数值≥当前列序号时填列名,否则填NA new_cols <- lapply(1:max_count, function(i) { ifelse(col_values >= i, col, NA_character_) }) # 给新列命名(如A1、A2) names(new_cols) <- paste0(col, 1:max_count) # 加入结果列表 result_list <- c(result_list, new_cols) } # 合并为最终数据框 final_df <- do.call(cbind, result_list) # 左对齐格式化输出 print(format(final_df, justify = "left"))
核心逻辑是循环处理每一列,根据列最大值生成对应数量的新列,通过判断原数值与列序号的关系填充内容,最终合并所有列并格式化输出。
Tidyverse 方案
library(tidyverse) df <- data.frame(ID = 1:3, A = c(2, 0, 1), B = c(0, 3, 2)) final_df <- df %>% # 将宽表转为长格式,拆分列名和数值 pivot_longer(-ID, names_to = "col", values_to = "count") %>% # 根据数值展开行,数值为0时不生成行 uncount(count, .remove = FALSE) %>% # 为每个ID和列的展开行添加序号 group_by(ID, col) %>% mutate(num = row_number()) %>% ungroup() %>% # 转回宽格式,缺失值填充NA pivot_wider( id_cols = ID, names_from = c(col, num), values_from = col, values_fill = NA_character_ ) %>% # 按列名排序,保证列顺序符合预期 select(ID, sort(names(.)[-1])) # 左对齐格式化输出 print(format(final_df, justify = "left"))
通过tidyverse的宽长表转换函数实现,先将数据转长后展开,再转回宽表,逻辑流畅,适合习惯tidyverse语法的用户。
内容的提问来源于stack exchange,提问作者user18894435
相关产品推荐
相关产品推荐

