【问题标题】:Combine 2 dataframes with function, like cartesian product or cross join将 2 个数据框与函数相结合,例如笛卡尔积或交叉连接
【发布时间】:2019-10-12 22:20:16
【问题描述】:

我想将两个不同大小的数据框与一个二进制函数(即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. 一个。使用full_join(加入by= 什么?) 湾。后跟tidyr::spread(),(或pivot_wider()??)
  2. 使用purrr::cross2()(或cross_dfr())(但它给出了错误的结构?)后跟(b1.b)
  3. 使用purrr::map2()mutate 的某种组合(我无法使其正常工作,map2 要求数据帧的长度相同)

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

【问题讨论】:

  • 样本数据没有给出str_detect 的正确结果。但这是一个样本,所以我想没关系?

标签: r dplyr tidyr cartesian-product cross-join


【解决方案1】:

这个answer 提到使用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

【讨论】:

    猜你喜欢
    • 2018-11-30
    • 2015-10-16
    • 2014-12-06
    • 1970-01-01
    • 2023-03-23
    • 2017-08-05
    • 1970-01-01
    • 2015-01-15
    • 2012-12-17
    相关资源
    最近更新 更多