使用“占优势”检索独特的组合。行

时间:2017-09-29 15:10:32

标签: r unique subset

我有一个可以使用以下代码生成的数据集

df <- data.frame(
        "Inv" = c("Name1", "Name1", "Name1", "Name1", "Name2", "Name2", "Name2", "Name3", "Name3", "Name3"), 
        "Loc"=c("Code1", "Code1", "Code2", "Code3", "Code2", "Code1", "Code2", "Code1", "Code2", "Code3")
    )

数据集按'Inv'排序。我需要从每组记录中提取一行,'Inv'的值相同。提取的行可以是第一行,也可以是具有显性'Loc'的行。为了进一步解释,我已经给出了以下选择的结果和推理

结果

逻辑是

  1. 提取第一行"Name1", "Code1"是因为组合Name1:Code1在'Inv'值为"Name1"的集合中出现两次。其他组合Name1:Code2和Name1:Code3每个只出现一次。因此,Name1:Code1是&#39;的主导&#39;情况下。

  2. 第二个"Name2", "Code2"被提取,因为组合Name2:Code2在集合中出现两次。

  3. 第三行"Name3", "Code1"被提取,因为所有三种组合Name3:Code1,Name3:Code2,Name3:Code3每次只出现一次,因为Name3:Code1是集合中的第一行,它是地选择。

  4. 我可以通过对'Inv'进行排序并逐行逐步执行数据集来实现此目的。但这是一个1200万行数据集,需要花费太多时间。

    有更简单快捷的方法吗?

    感谢您的帮助!

1 个答案:

答案 0 :(得分:1)

你可以尝试这样的事情,我们计算每个Inv中Loc的数量,只保留具有最大值的Loc行,并为每个剩余的组取第一行。请注意,您的示例数据不需要arrange(rowname, .by_group = TRUE),但我认为您需要对完整数据集进行此操作。

library(tidyverse); 
df %>% as_tibble() %>% rownames_to_column() %>%
  group_by(Inv, Loc) %>% 
  mutate(Loc_count = n()) %>%
  group_by(Inv) %>%
  filter(Loc_count == max(Loc_count)) %>%
  arrange(rowname, .by_group = TRUE) %>%
  summarise_all(first) %>%
  select(Inv, Loc)
#> # A tibble: 3 x 2
#>      Inv    Loc
#>   <fctr> <fctr>
#> 1  Name1  Code1
#> 2  Name2  Code2
#> 3  Name3  Code3