代码之家  ›  专栏  ›  技术社区  ›  Denis

如何使用查找进行矢量化?[复制]

r
  •  0
  • Denis  · 技术社区  · 6 年前

    假设我有两个数据帧df1和df2,如下所示

    Df1
    
    Id Price Profit Month
    10  5     2      1
    10  5     3      2
    10  5     2      3
    11  7     3      1
    11  7     1      2
    12  0     0      1
    12  5     1      2
    
    Df2
    
    Id Name
    9  Kane
    10 Jack
    10 Jack
    11 Will
    12 Matt
    13 Lee
    14 Han
    

    现在我想在 Df1 命名 Name 从中获取价值 Df2 Id

    所以修改后的Df1

    Id Price Profit Month Name
    10  5     2      1    Jack
    10  5     3      2    Jack
    10  5     2      3    Jack
    11  7     3      1    Will
    11  7     1      2    Will
    12  0     0      1    Matt
    12  5     1      2    Matt
    
    0 回复  |  直到 8 年前
        1
  •  8
  •   bgoldst    8 年前
    df1 <- data.frame(Id=c(10L,10L,10L,11L,11L,12L,12L),Price=c(5L,5L,5L,7L,7L,0L,5L),Profit=c(2L,3L,2L,3L,1L,0L,1L),Month=c(1L,2L,3L,1L,2L,1L,2L),stringsAsFactors=F);
    df2 <- data.frame(Id=c(9L,10L,10L,11L,12L,13L,14L),Name=c('Kane','Jack','Jack','Will','Matt','Lee','Han'),stringsAsFactors=F);
    df1$Name <- df2$Name[match(df1$Id,df2$Id)];
    df1;
    ##   Id Price Profit Month Name
    ## 1 10     5      2     1 Jack
    ## 2 10     5      3     2 Jack
    ## 3 10     5      2     3 Jack
    ## 4 11     7      3     1 Will
    ## 5 11     7      1     2 Will
    ## 6 12     0      0     1 Matt
    ## 7 12     5      1     2 Matt
    
        2
  •  7
  •   Vincent Bonhomme    8 年前

    使用 left_join dplyr

    library(dplyr)
    left_join(df1, df2, "Id")
    

    如:

    > left_join(df1, df2)
    Joining by: "Id"
      Id Price Profit Month Name
    1 10     5      2     1 Jack
    2 10     5      3     2 Jack
    3 10     5      2     3 Jack
    4 11     7      3     1 Will
    5 11     7      1     2 Will
    6 12     0      0     1 Matt
    7 12     5      1     2 Matt
    

    Data wrangling cheatsheet 通过RStudio是一个非常有用的资源。

        3
  •  3
  •   akrun    8 年前

    data.table

    library(data.table)
    setDT(Df1)[unique(Df2), on = "Id", nomatch=0]
    #   Id Price Profit Month Name
    #1: 10     5      2     1 Jack
    #2: 10     5      3     2 Jack
    #3: 10     5      2     3 Jack
    #4: 11     7      3     1 Will
    #5: 11     7      1     2 Will
    #6: 12     0      0     1 Matt
    #7: 12     5      1     2 Matt
    

    或者如@Arun在评论中提到的,我们可以( := )加入后的“名称”列 on

    setDT(Df1)[Df2, Name:= Name, on = "Id"]
    Df1
    
        4
  •  1
  •   RHertel    8 年前

    R 选择可能是 merge()

    merge(Df1,unique(Df2), by="Id")
    #  Id Price Profit Month Name
    #1 10     5      2     1 Jack
    #2 10     5      3     2 Jack
    #3 10     5      2     3 Jack
    #4 11     7      3     1 Will
    #5 11     7      1     2 Will
    #6 12     0      0     1 Matt
    #7 12     5      1     2 Matt
    

    功能 unique() Df2 by="Id"