【问题标题】:extracting a group of values based on the values in another data table using dplyr使用 dplyr 根据另一个数据表中的值提取一组值
【发布时间】:2018-05-14 19:23:33
【问题描述】:

想象一下,我有一个 LARGE 表 (table1),看起来与下面的相似。

表 1:

YEAR     MODEL    MAKE      ORDERCODE  COLOR

2001      BMW     328i      FAE        GREEN
2001      BMW     328i      SDC        BLACK
2001      LEXUS   LS430     ASD        PURPLE
2001      LEXUS   IS300     ASD        BLACK
2001      LEXUS   GS300h    YUK        BLACK
2001      LEXUS   GS300h    HNY        BLUE
2002      LEXUS   GS300h    ASF        PURPLE
2002      LEXUS   GS300h    FAS        BROWN
2002      LEXUS   GS300h    YUI        RED
2002      LEXUS   IS250d    ZXC        ORANGE
2002      LEXUS   IS250d    ASE        BLUE

我有另一个数据框,它有另一个品牌(假设它是一个雅阁,有黑色、蓝色、紫色和红色),所以它看起来像这样:

表 2:

MAKE     COLOR
Accord   BLACK
Accord   RED
Accord   BLUE
Accord   PURPLE    

我正在尝试查找表 1 中具有表 2 中所有颜色的所有汽车。我已经尝试使用 dplyr table1 %>% filter(COLOR %in% table2$COLOR),但我返回的任何行至少具有我正在寻找的给定颜色之一。我想返回具有我指定颜色的汽车制造的行。所以我的结果是这样的:

期望的结果:

2001      LEXUS   GS300h    YUK        BLACK
2001      LEXUS   GS300h    HNY        BLUE
2002      LEXUS   GS300h    ASF        PURPLE
2002      LEXUS   GS300h    FAS        BROWN
2002      LEXUS   GS300h    YUI        RED

【问题讨论】:

  • 所以从 table2 中 make 列并不重要。您只想检查表 2 中每个型号的表 1 中的所有颜色值。我理解对了吗?
  • 没有测试,但是你可以修改你的代码为table1 %>% group_by(MODEL, MAKE) %>% filter(all(COLOR %in% table2$COLOR))
  • @Yolo。 Table2 中的make 列是我最感兴趣的。我想在table2 中找到与table1 中的make 最相似的Make。我通过匹配颜色来定义相似性。
  • @DavidArenburg - 感谢您的建议。我试过了,但我最终只得到了一排。在我的真实数据集中,我只有 1 个键(Make),因此按模型分组没有帮助。
  • 对不起,我之前没有测试过代码,试试这个table1 %>% group_by(MODEL, MAKE) %>% filter(all(table2$COLOR %in% COLOR))

标签: r dplyr data.table


【解决方案1】:

(管道函数是%>% 而不是%<%。)需要根据品牌和型号在TABLE1 中创建分组,并在测试中反转%in% 操作的“方向”,并添加一个逻辑all 操作。问题是第二个表中的所有颜色是否存在于限制为单个分组的颜色中。

TABLE1 %>% group_by(MODEL, MAKE) %>% filter(all(TABLE2$COLOR %in% COLOR))
# A tibble: 5 x 5
# Groups:   MODEL, MAKE [1]
   YEAR MODEL MAKE   ORDERCODE COLOR 
  <int> <chr> <chr>  <chr>     <chr> 
1  2001 LEXUS GS300h YUK       BLACK 
2  2001 LEXUS GS300h HNY       BLUE  
3  2002 LEXUS GS300h ASF       PURPLE
4  2002 LEXUS GS300h FAS       BROWN 
5  2002 LEXUS GS300h YUI       RED   

【讨论】:

    【解决方案2】:

    为了找到最相似的,我们将找到每个模型的总颜色匹配,最后我们选择颜色匹配最高的模型。

    dplyr

    df %>% 
        group_by(MODEL,MAKE) %>% 
        mutate(slr = sum(df1$COLOR %in% COLOR)) %>% 
        filter(slr == max(slr))
    

    data.table

    setDT(df)
    df[,slr := sum(df1$COLOR %in% COLOR),.(MODEL,MAKE)]
    df = df[slr == max(slr)]
    print(df)
    

    输出是:

       YEAR MODEL   MAKE ORDERCODE  COLOR slr
    1: 2001 LEXUS GS300h       YUK  BLACK   4
    2: 2001 LEXUS GS300h       HNY   BLUE   4
    3: 2002 LEXUS GS300h       ASF PURPLE   4
    4: 2002 LEXUS GS300h       FAS  BROWN   4
    5: 2002 LEXUS GS300h       YUI    RED   4
    

    【讨论】:

    • 真的很抱歉.. 我意识到我把你误入歧途了...... Make 栏很重要。不是模型列。我的目标是在 table1 中找到最接近 table2 的 MAKE。对于那个很抱歉。我也会修复上面的评论
    • @Sheila 我已经更新了 data.table 解决方案请检查它是否正常。一会儿更新 dplyr 解决方案。
    • 嗨@YOLO,在这个例子中我想要的输出只是GS300h(制造)而不是所有雷克萨斯(模型)。我尝试对 MODEL 或 MAKE 进行替换,但没有得到所需的输出。
    • 这适用于示例,但如果每个 MODEL + MAKE 组合有重复的颜色,则将不起作用。
    【解决方案3】:

    这是使用dplyr的解决方案:

    library(dplyr)
    
    df1 %>%
      group_by(MODEL, MAKE) %>%
      mutate(COLOR2 = ifelse(COLOR %in% df2$COLOR, COLOR, NA),
             count = n_distinct(COLOR2[!is.na(COLOR2)])) %>%
      filter(count == nrow(df2)) %>%
      select(-COLOR2, -count)
    

    结果:

    # A tibble: 5 x 5
    # Groups:   MODEL, MAKE [1]
       YEAR MODEL   MAKE ORDERCODE  COLOR
      <int> <chr>  <chr>     <chr>  <chr>
    1  2001 LEXUS GS300h       YUK  BLACK
    2  2001 LEXUS GS300h       HNY   BLUE
    3  2002 LEXUS GS300h       ASF PURPLE
    4  2002 LEXUS GS300h       FAS  BROWN
    5  2002 LEXUS GS300h       YUI    RED
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2022-06-10
      • 1970-01-01
      • 2020-12-17
      • 1970-01-01
      • 1970-01-01
      • 2022-06-24
      • 1970-01-01
      相关资源
      最近更新 更多