如何合并嵌套在DataFrame中的子DataFrame并生成目标组合结果?
问题描述
我有如下示例数据sampledata,可通过以下代码生成:
# 生成示例数据 sampledatain1 <- data.frame(in_1=c(1,2,3,4,5),in_2=c("A","B","C","D","E"),stringsAsFactors = F) sampledatain2 <- data.frame(in_1=c(6,7,8,9,10),in_2=c("F","G","H","I","J"),stringsAsFactors = F) sampledatain3 <- data.frame(in_1=c(99,98,97,96,95),in_2=c("Z","Y","X","W","V"),stringsAsFactors = F) sampledata <- data.frame(row = 1:3, colmerge1 = c("MA","MB","MC"), colmerge2 = -99:-97, stringsAsFactors = FALSE) sampledata$df <- list(sampledatain1,sampledatain2,sampledatain3)
我希望将所有嵌套的子DataFrame展开,与对应行的外层列合并后组合成如下desired_data格式的结果:
# 生成目标数据 library(data.table) sampledatain1$row <- 1 sampledatain1$colmerge1 <- "MA" sampledatain1$colmerge2 <- -99 sampledatain2$row <- 2 sampledatain2$colmerge1 <- "MB" sampledatain2$colmerge2 <- -98 sampledatain3$row <- 3 sampledatain3$colmerge1 <- "MC" sampledatain3$colmerge2 <- -97 desired_data <- rbindlist(list(sampledatain1,sampledatain2,sampledatain3))
请问如何通过函数实现从sampledata生成desired_data?
解决方案
下面提供几种高效的实现方式:
方法1:使用data.table包(与目标代码风格一致)
直接利用data.table的分组展开功能,一步完成嵌套数据框的展开与外层列的合并:
library(data.table) setDT(sampledata) desired_data <- sampledata[, unnest(df), by = .(row, colmerge1, colmerge2)]
方法2:使用tidyverse系列包(dplyr + tidyr)
如果习惯tidyverse的管道语法,tidyr::unnest可以自动将嵌套列展开并与其他列匹配:
library(tidyverse) desired_data <- sampledata %>% unnest(df)
方法3:Base R原生实现(无需额外安装包)
通过循环遍历每一行,将外层列与对应子数据框合并,最后用do.call(rbind, ...)拼接所有结果:
desired_data <- do.call(rbind, lapply(1:nrow(sampledata), function(i) { cbind( sampledata[i, c("row", "colmerge1", "colmerge2"), drop = FALSE], sampledata$df[[i]] ) }))
内容的提问来源于stack exchange,提问作者Neal Barsch
相关产品推荐
相关产品推荐

