如何在动态公司数量场景下合并每行的嵌套DataFrame
问题描述
我用以下R代码(最小可复现示例)获取专利数据:
library(magrittr) data <- tibble::tibble( company = c( "Google", "Apple" ) ) %>% dplyr::mutate(patents = purrr::map( .x = company, .f = function(x) { data <- patentsview::search_pv( query = patentsview::qry_funs$contains(assignee_organization = x), fields = c( "app_number", "app_country", "app_date", "patent_abstract", "patent_date", "patent_number", "patent_title" ), sort = c("app_date" = "asc"), endpoint = "patents", mtchd_subent_only = FALSE ) patentsview::unnest_pv_data(data$data, pk = "patent_number") %>% lapply(FUN = tibble::as_tibble) %>% as.matrix() %>% t() %>% tibble::as_tibble() } )) %>% tidyr::unnest(cols = c(patents)) %>% tibble::column_to_rownames(var = "company") %>% t() %>% tibble::as_tibble(.name_repair = "unique", rownames = NA)
运行后得到的DataFrame结构如下:
> data # A tibble: 2 × 2 Google Apple * <list> <list> 1 <tibble [25 × 5]> <tibble [25 × 5]> 2 <tibble [25 × 4]> <tibble [25 × 4]>
示例里只用到两家公司,但实际场景中公司数量是动态变化的。我需要把每行里不同公司的嵌套DataFrame合并成单个DataFrame,新增一个Combined列,最终得到如下结构:
# A tibble: 2 × 3 Google Apple Combined * <list> <list> <list> 1 <tibble [25 × 5]> <tibble [25 × 5]> <tibble [50 × 5]> 2 <tibble [25 × 4]> <tibble [25 × 4]> <tibble [50 × 4]>
解决方案
可以用dplyr结合purrr的相关函数处理,推荐用rowwise配合c_across实现动态列的合并:
library(dplyr) library(purrr) library(tibble) data <- data %>% rowwise() %>% mutate(Combined = list(bind_rows(c_across(everything())))) %>% ungroup()
说明:
rowwise():指定后续操作按行执行c_across(everything()):动态选取当前行的所有列(即所有公司的嵌套DataFrame)bind_rows():将当前行的所有嵌套DataFrame合并为单个DataFrame,用list()包裹保持嵌套结构ungroup():取消按行分组状态,避免影响后续操作
如果公司列有特定命名规则(比如统一前缀),可以把everything()替换为starts_with("前缀名")这类列选择器,适配动态变化的列数。
内容的提问来源于stack exchange,提问作者Someone2
相关产品推荐
相关产品推荐

