【问题标题】:Merge two columns in 2 dataframes depending on matching pattern根据匹配模式合并 2 个数据框中的两列
【发布时间】:2020-08-12 18:51:53
【问题描述】:

我有两个数据框

Df1

Col1 Name Col3
ALL1 10 OP
ALL2 20 IO
ALL2 20 YU
ALL2 20 RT
ALL3 20 YU
ALL3 90 YU
ALL4 98 IU

DF2

   Col1bis Col2
    ALL1 OKI
    ALL2 OP
    ALL3 I
    ALL4 LOP

预期结果是:

DF2

  Col1bis Col2 Name
    ALL1 OKI 10
    ALL2 OP 20
    ALL3 I 90
    ALL4 LOP 98 

我想将Name 列添加到对应于 Col1 和 Col1bis 中相同模式的 df2。

【问题讨论】:

    标签: r dataframe join merge data.table


    【解决方案1】:

    您需要做的是合并或“加入”您的数据集,以下是三种最常见的方法:l.首先是我用来测试的数据。

    # Dummy data
    df1 <- data.frame(
      V1 = letters[1:10], 
      V2 = rnorm(10, 0, 1))
    df2 <- data.frame(
      V1 = letters[c(1,4,6)],
      V3 = rnorm(3, 0, 1))
    

    方法一是使用merge() 函数的base R,它给出了两个数据帧和一个变量,它应该通过它连接数据。

    # Base R
    merge(df1, df2, by = "V1")
    

    接下来是使用 tidyverse 包和管道 %&gt;%,首先选择 df1,然后使用 right_join() 函数,这是这些包中许多不同的连接函数之一。

    # Tidyverse
    library(tidyverse)
    df1 %>% right_join(df2, by = "V1")
    

    最后一个选项是我要使用的,来自 data.table 包。此处的连接变量由on = ... 给出。

    # Data.table
    library(data.table)
    # - convert to data.tables
    setDT(df1)
    setDT(df2)
    # - join
    df1[df2, on = "V1"]
    

    请注意,如果您将数据构建/读取为 data.table(分别使用 data.table()fread()),则可以跳过转换步骤。

    【讨论】:

    • 当然,我们可以在某个时间聊天
    • 谢谢 - 我会努力寻找机会之窗,你知道,我脸上没有 1 岁的孩子
    【解决方案2】:

    我们可以使用连接

    library(data.table)
    setDT(DF2)[DF1, Name := Name, on = .(Col1bis = Col1)]
    DF2
    #   Col1bis Col2 Name
    #1:    ALL1  OKI   10
    #2:    ALL2   OP   20
    #3:    ALL3    I   90
    #4:    ALL4  LOP   98
    

    或者在base Rmatch

    DF2$Name <- DF1$Name[match(DF2$Col1bis, DF1$Col1)]
    

    数据

    DF1 <- structure(list(Col1 = c("ALL1", "ALL2", "ALL2", "ALL2", "ALL3", 
    "ALL3", "ALL4"), Name = c(10L, 20L, 20L, 20L, 20L, 90L, 98L), 
        Col3 = c("OP", "IO", "YU", "RT", "YU", "YU", "IU")), class = "data.frame", row.names = c(NA, 
    -7L))
    
    DF2 <- structure(list(Col1bis = c("ALL1", "ALL2", "ALL3", "ALL4"), Col2 = c("OKI", 
    "OP", "I", "LOP")), class = "data.frame", row.names = c(NA, -4L
    ))
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-10-28
      • 2021-07-22
      • 1970-01-01
      • 1970-01-01
      • 2022-08-12
      • 1970-01-01
      • 2019-09-27
      • 1970-01-01
      相关资源
      最近更新 更多