You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.14 23:47:22