Объедините 2 кадра данных с функцией, такой как декартово произведение или перекрестное соединение - PullRequest
0 голосов
/ 13 октября 2019

Я хочу объединить два кадра данных разных размеров с помощью двоичной функции (а именно str_count()), чтобы строки df1 (содержащие регулярное выражение) стали столбцами df2 (содержа текстовые данные).

Sample product table result

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() (или cross_dfr()) (но это дает неправильную структуру?), Затем (b1.b)
  3. Используйте некоторую комбинацию purrr::map2() и mutate (я не смог заставить это работать должным образом, и map2 требует, чтобы кадры данных были одинаковой длины)

Использование регулярных выражений просто в качестве примера (и с чем я работаю). Кроме того, хотя я использую tidyverse библиотеки, любое другое элегантное (простое?) Решение, которое работает, прекрасно (я просто склонен делать ошибки, если слишком много промежуточных шагов).

1 Ответ

0 голосов
/ 13 октября 2019

Этот ответ упоминается с использованием 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
...