AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / coding / 问题 / 78893862
Accepted
TarJae
TarJae
Asked: 2024-08-21 02:05:51 +0800 CST2024-08-21 02:05:51 +0800 CST 2024-08-21 02:05:51 +0800 CST

如何通过匹配相同的字符串来连接两个长度不等的列

  • 772

我有两个具有唯一值且长度不等的 tibbles,例如:

df1 <- structure(list(col1 = c("A", "T", "C", "D", "X", "F")), class = c("tbl_df", "tbl", "data.frame"), row.names = c(NA, -6L))
df2 <- structure(list(col2 = c("A", "B", "C", "D", "E", "F", "G", "H", "I", "J")), class = c("tbl_df", "tbl", "data.frame"), row.names = c(NA, -10L))
> df1
# A tibble: 6 × 1
  col1 
  <chr>
1 A    
2 T    
3 C    
4 D    
5 X    
6 F 
> df2
# A tibble: 9 × 1
  col2 
  <chr>
1 A    
2 B    
3 C    
4 D    
5 F    
6 G    
7 H    
8 I    
9 J   

我想要得到:

> df3
# A tibble: 11 × 2
   col1  col2 
   <chr> <chr>
 1 A     A    
 2 NA    B    
 3 T     NA   
 4 C     C    
 5 D     D    
 6 X     NA   
 7 F     F    
 8 NA    G    
 9 NA    H    
10 NA    I    
11 NA    J

df1 的 col1 和 df2 的 col2 中的每个相同字符串应并排位于同一行中。例如,如果 col1 和 col2 中的字符串相同,则它们应位于同一行(例如字符串 A)。如果字符串存在于 col1 中但不存在于 col2 中,则它在 col2 中应为 NA,反之亦然。

如有任何建议我将不胜感激。

  • 3 3 个回答
  • 70 Views

3 个回答

  • Voted
  1. Best Answer
    Seth
    2024-08-21T02:14:36+08:002024-08-21T02:14:36+08:00
    library(dplyr)
    
    full_join(df1, df2, by = join_by(col1 == col2), keep = TRUE)
    #> # A tibble: 12 × 2
    #>    col1  col2 
    #>    <chr> <chr>
    #>  1 A     A    
    #>  2 T     <NA> 
    #>  3 C     C    
    #>  4 D     D    
    #>  5 X     <NA> 
    #>  6 F     F    
    #>  7 <NA>  B    
    #>  8 <NA>  E    
    #>  9 <NA>  G    
    #> 10 <NA>  H    
    #> 11 <NA>  I    
    #> 12 <NA>  J
    
    • 5
  2. ThomasIsCoding
    2024-08-21T04:13:32+08:002024-08-21T04:13:32+08:00

    基础 R 解决方案

    lst <- c(df1, df2)
    v <- unique(unlist(lst))
    list2DF(lapply(lst, \(x) x[match(v, x)]))
    

    给出

       col1 col2
    1     A    A
    2     T <NA>
    3     C    C
    4     D    D
    5     X <NA>
    6     F    F
    7  <NA>    B
    8  <NA>    E
    9  <NA>    G
    10 <NA>    H
    11 <NA>    I
    12 <NA>    J
    

    另一个基本 R 解决方案是使用stack+reshape

    reshape(
      transform(
        stack(c(df1, df2)),
        r = as.integer(factor(values))
      ),
      direction = "wide",
      idvar = "r",
      timevar = "ind"
    )[-1]
    

    给出

       values.col1 values.col2
    1            A           A
    2            T        <NA>
    3            C           C
    4            D           D
    5            X        <NA>
    6            F           F
    8         <NA>           B
    11        <NA>           E
    13        <NA>           G
    14        <NA>           H
    15        <NA>           I
    16        <NA>           J
    

    第三个基本 R 选项是使用table

    d <- table(stack(c(df1, df2)))
    as.data.frame(ifelse(d > 0, row.names(d), NA))
    

    给出

      col1 col2
    A    A    A
    B <NA>    B
    C    C    C
    D    D    D
    E <NA>    E
    F    F    F
    G <NA>    G
    H <NA>    H
    I <NA>    I
    J <NA>    J
    T    T <NA>
    X    X <NA>
    

    基准

    tic1 <- \() {
      lst <- c(df1, df2)
      v <- unique(unlist(lst))
      list2DF(lapply(lst, \(x) x[match(v, x)]))
    }
    
    tic2 <- \() {
      reshape(
        transform(
          stack(c(df1, df2)),
          r = as.integer(factor(values))
        ),
        direction = "wide",
        idvar = "r",
        timevar = "ind"
      )[-1]
    }
    
    tic3 <- \() {
      d <- table(stack(c(df1, df2)))
      as.data.frame(ifelse(d > 0, row.names(d), NA))
    }
    
    microbenchmark(
      tic1(),
      tic2(),
      tic3(),
      unit = "relative"
    )
    

    节目

    Unit: relative
       expr      min        lq      mean   median        uq      max neval
     tic1()  1.00000  1.000000  1.000000  1.00000  1.000000 1.000000   100
     tic2() 40.30049 30.210059 16.153643 30.60000 24.474138 1.423185   100
     tic3() 13.77833  9.902367  6.136188 10.15569  9.180251 1.553357   100
    
    • 4
  3. GKi
    2024-08-21T13:53:39+08:002024-08-21T13:53:39+08:00

    使用的基本解决方案merge,通过添加新列用于合并,然后将其删除。

    merge(cbind(x=df1[[1]], df1), cbind(x=df2[[1]], df2), all=TRUE)[-1]
    #   col1 col2
    #1     A    A
    #2  <NA>    B
    #3     C    C
    #4     D    D
    #5  <NA>    E
    #6     F    F
    #7  <NA>    G
    #8  <NA>    H
    #9  <NA>    I
    #10 <NA>    J
    #11    T <NA>
    #12    X <NA>
    
    • 3

相关问题

  • 将复制活动的序列号添加到 Blob

  • Packer 动态源重复工件

  • 选择每组连续 1 的行

  • 图形 API 调用列表 subscribedSkus 状态权限不足,但已授予权限

  • 根据列值创建单独的 DF 的函数

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    Vue 3:创建时出错“预期标识符但发现‘导入’”[重复]

    • 1 个回答
  • Marko Smith

    为什么这个简单而小的 Java 代码在所有 Graal JVM 上的运行速度都快 30 倍,但在任何 Oracle JVM 上却不行?

    • 1 个回答
  • Marko Smith

    具有指定基础类型但没有枚举器的“枚举类”的用途是什么?

    • 1 个回答
  • Marko Smith

    如何修复未手动导入的模块的 MODULE_NOT_FOUND 错误?

    • 6 个回答
  • Marko Smith

    `(表达式,左值) = 右值` 在 C 或 C++ 中是有效的赋值吗?为什么有些编译器会接受/拒绝它?

    • 3 个回答
  • Marko Smith

    何时应使用 std::inplace_vector 而不是 std::vector?

    • 3 个回答
  • Marko Smith

    在 C++ 中,一个不执行任何操作的空程序需要 204KB 的堆,但在 C 中则不需要

    • 1 个回答
  • Marko Smith

    PowerBI 目前与 BigQuery 不兼容:Simba 驱动程序与 Windows 更新有关

    • 2 个回答
  • Marko Smith

    AdMob:MobileAds.initialize() - 对于某些设备,“java.lang.Integer 无法转换为 java.lang.String”

    • 1 个回答
  • Marko Smith

    我正在尝试仅使用海龟随机和数学模块来制作吃豆人游戏

    • 1 个回答
  • Martin Hope
    Aleksandr Dubinsky 为什么 InetAddress 上的 switch 模式匹配会失败,并出现“未涵盖所有可能的输入值”? 2024-12-23 06:56:21 +0800 CST
  • Martin Hope
    Phillip Borge 为什么这个简单而小的 Java 代码在所有 Graal JVM 上的运行速度都快 30 倍,但在任何 Oracle JVM 上却不行? 2024-12-12 20:46:46 +0800 CST
  • Martin Hope
    Oodini 具有指定基础类型但没有枚举器的“枚举类”的用途是什么? 2024-12-12 06:27:11 +0800 CST
  • Martin Hope
    sleeptightAnsiC `(表达式,左值) = 右值` 在 C 或 C++ 中是有效的赋值吗?为什么有些编译器会接受/拒绝它? 2024-11-09 07:18:53 +0800 CST
  • Martin Hope
    The Mad Gamer 何时应使用 std::inplace_vector 而不是 std::vector? 2024-10-29 23:01:00 +0800 CST
  • Martin Hope
    Chad Feller 在 5.2 版中,bash 条件语句中的 [[ .. ]] 中的分号现在是可选的吗? 2024-10-21 05:50:33 +0800 CST
  • Martin Hope
    Wrench 为什么双破折号 (--) 会导致此 MariaDB 子句评估为 true? 2024-05-05 13:37:20 +0800 CST
  • Martin Hope
    Waket Zheng 为什么 `dict(id=1, **{'id': 2})` 有时会引发 `KeyError: 'id'` 而不是 TypeError? 2024-05-04 14:19:19 +0800 CST
  • Martin Hope
    user924 AdMob:MobileAds.initialize() - 对于某些设备,“java.lang.Integer 无法转换为 java.lang.String” 2024-03-20 03:12:31 +0800 CST
  • Martin Hope
    MarkB 为什么 GCC 生成有条件执行 SIMD 实现的代码? 2024-02-17 06:17:14 +0800 CST

热门标签

python javascript c++ c# java typescript sql reactjs html

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve