【问题标题】:Retrieving unique combinations with 'dominant' row检索具有“主导”行的唯一组合
【发布时间】:2017-09-29 15:10:32
【问题描述】:

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

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 是“主要”情况。

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

  3. 第三行 "Name3", "Code1" 被提取,因为 Name3:Code1、Name3:Code2、Name3:Code3 的所有三个组合都只出现一次,并且因为 Name3:Code1 是集合中的第一行,所以它被选中。

我可以通过对'Inv' 进行排序并逐行遍历数据集来做到这一点。但这是一个 1200 万行的数据集,需要花费太多时间。

有没有更简单快捷的方法?

感谢您的帮助!

【问题讨论】:

  • @akrun,我认为 OP 想要一个稍微不同的答案,因为他们希望在每个 Inv 组中保留最频繁出现的 loc 值。我之所以意识到这一点,是因为我对前面这个措辞相似的问题给出了与您相同的答案 - stackoverflow.com/q/46482459/8475145

标签: r unique subset


【解决方案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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-10-01
    • 2020-03-22
    • 1970-01-01
    • 2016-02-15
    • 1970-01-01
    • 2020-10-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多