首页 文章

通过将列与另一个数据框中的列匹配,在数据框中创建新列

提问于
浏览
2

假设我有数据框df1:

df1
    R1
1   A
2   B
3   C
4   D
5   E
6   F
7   G
8   H

另一个数据框df2:

df2
    R1  R2
1   A   2
2   B   5
3   D   7
4   E   9
5   F   12
6   J   16

我如何在名为R2的df1中创建一个新列,根据df2 $ R1的匹配条目将df2 $ R2中的正确值归为df1 $ R2?我试图这样做的任何方式我最终得到与长度差异有关的错误 . 但是,有没有办法可以将df2 $ R2中的值强制转换为df1中的新列,并且在df1中的任何行中只有NAs(或NaN或其他),而df2 $ R1中不存在相应的值?并且还忽略了df2中df1中没有对应行的条目(例如,第6行,其中R1 = J,因为df1 $ R1中没有J) . 对于我的例子,我想要的数据集如下所示:

R1  R2
1   A   2
2   B   5
3   C   NA
4   D   7
5   E   9
6   F   12
7   G   NA
8   H   NA

所以基本上,如果df2 $ R1与df1 $ R1相同,则df1 $ R2应等于df2 $ R2等于 . 对不起,如果之前有人询问,如果有,我找不到它 . 谢谢 .

2 回答

  • 2

    这是 match 函数的任务 . 它的主要用途是生成适用于"["函数的索引,即用于选择其他元素或行 . 它是 merge 操作中的一个关键功能,但是完整的 merge 并不是你所要求的:

    df1 <- read.table(text="R1
     1   A
     2   B
     3   C
     4   D
     5   E
     6   F
     7   G
     8   H", header=TRUE)
     df2<- read.table(text=" R1  R2
     1   A   2
     2   B   5
     3   D   7
     4   E   9
     5   F   12
     6   J   16", header=TRUE)
     df1$R2 <- df2$R2[ match(df1$R1, df2$R1) ]
     df1
    #-----------
      R1 R2
    1  A  2
    2  B  5
    3  C NA
    4  D  7
    5  E  9
    6  F 12
    7  G NA
    8  H NA
    
  • 1

    merge 使用 all.x (或 all.y )参数执行此操作,以指示使用其中一个输入的所有行:

    merge(df1, df2, all.x=TRUE)
    ##   R1 R2
    ## 1  A  2
    ## 2  B  5
    ## 3  C NA
    ## 4  D  7
    ## 5  E  9
    ## 6  F 12
    ## 7  G NA
    ## 8  H NA
    

相关问题