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

在R语言中生成含唯一ID的行并添加带原变量名的新变量

R语言实现按数值生成重复行并添加唯一ID

方法一:使用tidyverse工具链(推荐)

先构造示例数据,再通过数据重塑、过滤、行重复和ID生成完成转换:

library(tidyverse)

# 原数据框
df <- data.frame(
  ID = 1:3,
  V1 = c(2, 0, 1),
  V2 = c(0, 4, 5)
)

# 核心转换代码
result <- df %>%
  # 宽转长:提取变量名到ExVar,对应数值到n
  pivot_longer(cols = c(V1, V2), names_to = "ExVar", values_to = "n") %>%
  # 过滤掉数值为0的行(无需生成对应行)
  filter(n > 0) %>%
  # 根据n的数值重复每行n次
  uncount(n) %>%
  # 生成自增的唯一ID
  mutate(Unique_ID = row_number()) %>%
  # 重命名原ID为ExID
  rename(ExID = ID) %>%
  # 调整列顺序为目标格式
  select(Unique_ID, ExVar, ExID)

# 查看结果
print(result)

运行后会输出你需要的格式,每个步骤的作用已在注释中说明。

方法二:使用Base R实现

如果不想加载额外包,可以用Base R的原生函数完成:

# 原数据框
df <- data.frame(
  ID = 1:3,
  V1 = c(2, 0, 1),
  V2 = c(0, 4, 5)
)

# 宽转长格式
long_df <- reshape(df, direction = "long", varying = c("V1", "V2"), 
                   v.names = "n", timevar = "ExVar", times = c("V1", "V2"))
row.names(long_df) <- NULL

# 过滤数值大于0的行,并按数值重复行
filtered <- long_df[long_df$n > 0, ]
result <- filtered[rep(seq(nrow(filtered)), filtered$n), ]

# 添加唯一ID并整理列
result$Unique_ID <- seq(nrow(result))
result$ExID <- result$ID
result <- result[, c("Unique_ID", "ExVar", "ExID")]
row.names(result) <- NULL

# 查看结果
print(result)

两种方法最终输出的结果完全一致,可根据自己的习惯选择。

内容的提问来源于stack exchange,提问作者Tripy

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.12 20:35:06