首页 > 解决方案 > 将 2 个数据框与函数相结合,例如笛卡尔积或交叉连接

问题描述

我想将两个不同大小的数据帧与一个二进制函数(即str_count())结合起来,这样df1(包含正则表达式)的行变成df2(包含文本数据)的列。

示例产品表结果

library(dplyr)

# dummy data
df1 <- 
  tribble(
    ~regex_name, ~regex_data
    , "reg1", "(\\w+ )"
    , "reg2", "\\d+"
  )

df2 <- 
  tribble(
    ~metadata, ~text
    , "meta1", "text 1"
    , "meta2", "text2 3 4"
  )

# should result in something like
df1_2 <- 
  tribble(
    ~metadata, ~text,       ~reg1, ~reg2
    , "meta1", "text 1",    1,     2
    , "meta2", "text2 3 4", 0,     3
  )

到目前为止我尝试过的

在网上搜索了一下之后,我认为我可以采取一些可能的方法,这些方法涉及一些问题,或者可能是一些不必要的中间步骤。

  1. 一个。使用a full_join(加入by=什么?)b。后跟tidyr::spread(),(或pivot_wider()??)
  2. 使用purrr::cross2()(or cross_dfr()) (但它给出了错误的结构?)后跟 (b1.b)
  3. 使用purrr::map2()和的某种组合mutate(我无法让它正常工作,并且map2要求数据帧具有相同的长度)

正则表达式的使用只是一个例子(也是我正在使用的)。此外,虽然我使用的是tidyverse库,但任何其他优雅(简单?)的解决方案都很好(如果中间步骤太多,我很容易出错)。

标签: rdplyrtidyrcartesian-productcross-join

解决方案


这个答案提到使用tidyr::crossing. 与purrr::cross2. 这可能很简单,但我想知道是否可以一步完成?

library(dplyr)
library(tidyr)
library(stringr) # for example function

crossing(df1, df2) %>%
  mutate(regex_data = text %>% str_count(regex_data)) %>%
  pivot_wider(names_from = regex_name, values_from = regex_data) # as alternative to spread
#> # A tibble: 2 x 4
#>   metadata text       reg1  reg2
#>   <chr>    <chr>     <int> <int>
#> 1 meta1    text 1        1     1
#> 2 meta2    text2 3 4     2     3

推荐阅读