r - 将 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
)
到目前为止我尝试过的
在网上搜索了一下之后,我认为我可以采取一些可能的方法,这些方法涉及一些问题,或者可能是一些不必要的中间步骤。
- 一个。使用a
full_join
(加入by=
什么?)b。后跟tidyr::spread()
,(或pivot_wider()
??) - 使用
purrr::cross2()
(orcross_dfr()
) (但它给出了错误的结构?)后跟 (b1.b) - 使用
purrr::map2()
和的某种组合mutate
(我无法让它正常工作,并且map2
要求数据帧具有相同的长度)
正则表达式的使用只是一个例子(也是我正在使用的)。此外,虽然我使用的是tidyverse
库,但任何其他优雅(简单?)的解决方案都很好(如果中间步骤太多,我很容易出错)。
解决方案
这个答案提到使用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
推荐阅读
- laravel - 是否有任何指南来配置 Vuetify/Webpack 以使用 vuetify 加载程序?
- android - 导航组件:显示带圆角的对话框
- excel - CopyFolder 如果文件夹不存在通配符
- c++ - 如何从具有多种类型的单行文件中仅读取一种类型?
- common-lisp - 在这个 Common Lisp 示例中,socket-close 的目的是什么?
- terminal - Linux终端快捷方式
- python - 如何使用相同的anaconda管理不同的模块版本?
- python - 如何将事件连接到 matplotlib.collections.PatchCollection
- windows - 在批处理文件脚本中查找通配符列表的最新文件
- django - 使用 mysite.urls 中定义的 URLconf 时出错(Django 教程)