R:使用派生列值连接 Tibbles

标签 r join dplyr tibble derivative

考虑以下小标题:

library(tidyverse)

tbl_base_ids = tibble(base_id = c("ABC", "ABCDEF", "ABCDEFGHI"), base_id_length = c(3, 6, 9), record_id_length = c(10, 12, 15))
tbl_records  = tibble(record_id = c("ABC1234567", "ABCDEF123456", "ABCDEFGHI123456"))

我想连接匹配的行以生成第三个小标题:

tbl_records_with_base 

  record_id
  base_id
  base_id_length
  record_id_length

正如您所看到的,这不是连接前两个变量中的一个或多个变量的问题。这需要匹配变量导数。在 SQL 中,我会这样做:

  SELECT A.record_id, 
    B.base_id, 
    B.base_id_length, 
    B.record_id_length
  FROM tbl_records A 
    JOIN tbl_base_ids B 
      ON LENGTH(a.record_id) = B.record_id_length
        AND LEFT(a.record_id, B.base_id_length) = B.base_id

我尝试过 dplyr 连接的变体并使用 match 函数,但无济于事。有人可以帮忙吗?谢谢。

最佳答案

您应该想出一些逻辑来将 base_idrecord_id 分开。因为仅加入 record_id_length 是不够的。对于此示例,如果我们从 record_id 中删除所有数字,我们就可以获得 base_id。根据您的实际数据集,您需要根据需要更改此设置。

完成后,我们可以通过 base_idrecord_id_lengthtbl_recordstbl_base_ids 连接起来。

library(dplyr)

tbl_records %>%
  mutate(base_id = sub('\\d+', '', record_id),
         record_id_length = nchar(record_id)) %>%
  inner_join(tbl_base_ids, by = c("base_id", "record_id_length")) -> result

result

#  record_id       base_id   record_id_length base_id_length
#  <chr>           <chr>                <dbl>          <dbl>
#1 ABC1234567      ABC                     10              3
#2 ABCDEF123456    ABCDEF                  12              6
#3 ABCDEFGHI123456 ABCDEFGHI               15              9

关于R:使用派生列值连接 Tibbles,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65694040/

相关文章:

r - 时间戳记R序列毫秒

r - R中的快速Levenshtein距离?

r - 对于每一行,将特定列(由另一个数据框定义)中的值替换为向量中的值

join - Laravel Eloquent 地从联接表中选择了最新的行

mysql - 有什么比在 MySQL 中连接表更有效的方法吗?

r - 获取最频繁的条目

mysql - 根据已知 ID 连接多个表

r - 使用 dplyr 获取 R 中 data.frame 列总和的更好方法

r - R中ntile和cut之间的区别,然后分位数()函数

r - 将数据框中的值与其他列中的另一个匹配项匹配