【问题标题】:DPLYR lookup or join? How to approach this?DPLYR 查找或加入?如何解决这个问题?
【发布时间】:2017-06-15 04:03:36
【问题描述】:

我有两张表,都有以下字段:

  • 日期
  • 身份证
  • 蔬菜
  • 水果
  • 指标

df2 是 df1 的子集。 df1 大约有 8k 条记录,df2 大约有 4k 条记录。

我的目标是创建一个新的 df 或向父数据框 df1 添加一列,其中包含日期/id 组合是否存在于 df2 中的真/假。基本上是一个查找。

我应该走查找表路线还是应该通过连接 df1 和 2 创建一个新的数据框?

我不能仅凭 id 加入,必须是 id 和日期的组合,因为某些 id 在不同的日期返回。

我试过left_join()

comb <- left_join(x = df1, y = df2, by=c("date", "id"))

但是当我真的只想保留 df1 列时,结果返回了水果和蔬菜的列:

  • 日期
  • 身份证
  • 蔬菜.x
  • 水果.x
  • metric.x
  • 蔬菜.y
  • fruits.y
  • metric.y

我想要的只是:

  • 日期
  • 身份证
  • 蔬菜
  • 水果
  • InDF2(布尔值)
  • 指标

确定 df1 中的哪些行 (date + id) 也存在于 df2 (date + id) 中的最佳方法是什么?

【问题讨论】:

    标签: r dplyr


    【解决方案1】:
    1. 也许pastedateid 转换为每个df 的向量,比如df1_vectordf2_vector
    2. 使用%in%
    3. 试试df1$df2_presence_check = paste(df1$date,df1$id) %in% paste(df2$date,df2$id)

    示例

    set.seed(42)
    a = sample(letters, 5)
    b = sample(letters,15)
    a %in% b
    #[1] FALSE FALSE  TRUE  TRUE  TRUE
    
    #OR
    
    b %in% a
    #[1] FALSE FALSE FALSE FALSE FALSE FALSE  TRUE FALSE FALSE FALSE FALSE  TRUE FALSE  TRUE FALSE
    

    【讨论】:

    • 成功了,谢谢您的建议,将其与 mutate() 结合使用以添加新列。
    【解决方案2】:

    这是一个完全在dplyr 中的解决方案。我假设 id 和 date 代表唯一键。

    让我们添加一些数据以实现可重复性

    set.seed(23489)
    n <- 10
    
    df1 <- data.frame(
      id=sample(1e4:9e4, n),
      date=sample(seq(as.Date('2015/01/01'), as.Date('2017/01/01'), by="day"), n),
      vegetables= c("Broccoli", "Cabbage", "Calabrese", "Carrots", "Cauliflower", 
                    "Celery", "Chard", "Endive", "Fiddleheads", "Frisee"),
      fruits=c("Jabuticaba", "Jackfruit", "Jambul", "Jujube", "Juniper berry",
               "Kiwi", "Kumquat", "Lemon", "Lime", "Loquat"),
      metric=rnorm(n=n)
    )
    
    df2 <- df1[sample(seq_len(nrow(df1)), n/2), ]
    

    接下来,我们生成您想要的输出

    df1 %>%
      left_join(select(mutate(df2, InDF2=TRUE), id, date, InDF2), by=c("id", "date")) %>%
      mutate(InDF2=ifelse(is.na(InDF2), FALSE, TRUE))
    
    #       id       date  vegetables        fruits      metric InDF2
    # 1  80283 2016-11-26    Broccoli    Jabuticaba  1.68765979 FALSE
    # 2  14766 2016-10-18     Cabbage     Jackfruit -0.16774908 FALSE
    # 3  19532 2015-03-29   Calabrese        Jambul -1.18328968  TRUE
    # 4  46187 2015-03-09     Carrots        Jujube  1.83044569 FALSE
    # 5  76852 2016-01-11 Cauliflower Juniper berry -0.05744373 FALSE
    # 6  45507 2015-10-27      Celery          Kiwi -1.78166251 FALSE
    # 7  65227 2016-07-07       Chard       Kumquat -1.84756162  TRUE
    # 8  71433 2015-05-25      Endive         Lemon  0.77346596  TRUE
    # 9  17002 2016-10-22 Fiddleheads          Lime  1.09118108  TRUE
    # 10 52797 2015-06-29      Frisee        Loquat -0.46491328  TRUE
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-10-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-03-16
      相关资源
      最近更新 更多