在R中如何将含空DataFrame的列表转换为带元素序号的DataFrame?
需求说明
现有一个列表d,其中每个元素是包含start和end列的data.frame,部分元素可能为空。需要将这些data.frame合并为一个新的data.framee,新增serial_number列对应原列表的元素序号,空元素对应的行需要忽略,最终结果如下:
e <- data.frame(serial_number=c(1,1,1,1,3,3,3), start=c(2,3,4,5,5,3,4), end=c(5,7,8,9,7,9,8) )
高效解决方案
方法1:用dplyr快速实现
借助tidyverse中的dplyr包,bind_rows可以直接合并列表元素,通过.id参数生成序号列,之后过滤掉空行即可:
library(dplyr) # 合并列表并生成序号列 combined <- bind_rows(d, .id = "serial_number") # 过滤空行并转换序号为整数类型 e <- combined %>% filter(!is.na(start)) %>% mutate(serial_number = as.integer(serial_number))
方法2:用data.table处理大数据场景
如果数据量较大,data.table的rbindlist性能更优,同样通过idcol参数生成序号列,再过滤空行:
library(data.table) # 合并列表并生成序号列 dt_combined <- rbindlist(d, idcol = "serial_number") # 过滤空行、转换序号类型,按需转成data.frame e <- dt_combined[!is.na(start)] e[, serial_number := as.integer(serial_number)] e <- as.data.frame(e)
关于之前报错的说明
之前用bind_rows或unlist报错,大概率是没处理空data.frame生成的NA行,或者没通过参数生成序号列。上面两种方法都能自动处理列类型兼容问题,同时高效完成合并。
内容的提问来源于stack exchange,提问作者Fat Pat
相关产品推荐
相关产品推荐

