在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
相关产品推荐
相关产品推荐

