【问题标题】:group by text in columns, look for common entries in two data frames按列中的文本分组,在两个数据框中查找常见条目
【发布时间】:2019-12-03 00:46:49
【问题描述】:

我正在尝试比较两个数据框中的列,以提取出现在两者中的项目。具体来说:

df1:
 state group species
1 CA 2 cat, dog, chicken, mouse
2 CA 1 cat
3 NV 1 dog, chicken
4 NV 2 chicken
5 WA 1 chicken, rat, mouse, lion
6 WA 2 dog, cat
7 WA 3 dog, chicken
8 WA 4 cat, chicken

df2:
 state special_species
1 CA cat
2 CA chicken
3 CA mouse
4 WA cat
5 WA chicken
6 NV dog

我有兴趣确定df2 中的哪些special_species 出现在df1 中。我想要一个包含状态、组和特殊物种的新数据框。我认为它应该是连接、group_bysummarize 的组合,但我似乎无法让它发挥作用。

【问题讨论】:

    标签: r group-by dplyr summarize


    【解决方案1】:

    我们可以将 'df1' 中的 'species' 列通过 ,separate_rows 拆分,然后进行连接

    library(tidyr)
    library(dplyr)
    separate_rows(df1, species) %>%
        select(-group) %>%
        distinct %>%
        intersect(set_names(df2, c('state', 'species')))
    #  state species
    #1    CA     cat
    #2    CA chicken
    #3    CA   mouse
    #4    NV     dog
    #5    WA chicken
    #6    WA     cat
    

    或者做一个inner_join

    separate_rows(df1, species) %>%
       select(-group) %>%
       distinct %>%
        inner_join(df2, by = c('state', 'species' = 'special_species'))
    

    数据

    df1 <- structure(list(state = c("CA", "CA", "NV", "NV", "WA", "WA", 
    "WA", "WA"), group = c(2L, 1L, 1L, 2L, 1L, 2L, 3L, 4L), species = c("cat, dog, chicken, mouse", 
    "cat", "dog, chicken", "chicken", "chicken, rat, mouse, lion", 
    "dog, cat", "dog, chicken", "cat, chicken")), 
    class = "data.frame", row.names = c("1", 
    "2", "3", "4", "5", "6", "7", "8"))
    
    df2 <- structure(list(state = c("CA", "CA", "CA", "WA", "WA", "NV"), 
        special_species = c("cat", "chicken", "mouse", "cat", "chicken", 
        "dog")), class = "data.frame", row.names = c("1", "2", "3", 
    "4", "5", "6"))
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-06-07
      • 2021-03-19
      • 2023-03-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-01-18
      相关资源
      最近更新 更多