如何为R语言列表中的多个DataFrame生成连续ID序列
为列表中的多个DataFrame生成连续ID列
我有一个包含多个DataFrame的列表,示例代码如下:
Name <- c("Jon", "Bill", "Maria", "Ben", "Tina") Age <- c(23, 41, 32, 58, 26) df1 <- data.frame(Name, Age) Name <- c("Jon", "Bill", "Maria", "Ben", "Tina") Age <- c(23, 41, 32, 58, 26) df2 <- data.frame(Name, Age) df_list <- list(df1, df2)
我需要为列表里的所有DataFrame添加连续递增的ID列,让ID在整个列表的DataFrame中保持连续(注:你给出的示例中第二个ID为5-9,属于半连续重复,以下方案按无重复的严格连续递增处理,若需保留重复逻辑可调整代码参数)。期望的标准连续输出效果如下:
Name <- c("Jon", "Bill", "Maria", "Ben", "Tina") Age <- c(23, 41, 32, 58, 26) ID <- c(1:5) df1 <- data.frame(Name, Age, ID) Name <- c("Jon", "Bill", "Maria", "Ben", "Tina") Age <- c(23, 41, 32, 58, 26) ID <- c(6:10) df2 <- data.frame(Name, Age, ID) df_list <- list(df1, df2)
解决方案
方法一:Base R 原生实现
无需额外安装包,用基础R函数即可完成:
# 获取每个DataFrame的行数 row_counts <- sapply(df_list, nrow) # 计算每个DataFrame的ID起始值 start_ids <- c(1, cumsum(row_counts)[-length(row_counts)] + 1) # 循环为每个DataFrame添加ID列 for (i in seq_along(df_list)) { end_id <- start_ids[i] + row_counts[i] - 1 df_list[[i]]$ID <- start_ids[i]:end_id }
方法二:purrr包函数式实现
若习惯使用tidyverse工具链,可借助purrr包实现更简洁的批量处理:
library(purrr) # 计算每个DataFrame的行数与ID起始值 row_nums <- map_int(df_list, nrow) id_starts <- c(1, cumsum(row_nums)[-length(row_nums)] + 1) # 批量为每个DataFrame添加连续ID列 df_list <- map2(df_list, id_starts, function(df, start) { df$ID <- start:(start + nrow(df) - 1) df })
执行任意一种方法后,df_list中的每个DataFrame都会带有连续递增的ID列。
内容的提问来源于stack exchange,提问作者Sulz
相关产品推荐
相关产品推荐

