我有一个可以使用以下代码生成的数据集
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'
的行。为了进一步解释,我已经给出了以下选择的结果和推理
结果
逻辑是
提取第一行"Name1", "Code1"
是因为组合Name1:Code1在'Inv'
值为"Name1"
的集合中出现两次。其他组合Name1:Code2和Name1:Code3每个只出现一次。因此,Name1:Code1是&#39;的主导&#39;情况下。
第二个"Name2", "Code2"
被提取,因为组合Name2:Code2在集合中出现两次。
第三行"Name3", "Code1"
被提取,因为所有三种组合Name3:Code1,Name3:Code2,Name3:Code3每次只出现一次,因为Name3:Code1是集合中的第一行,它是地选择。
我可以通过对'Inv'
进行排序并逐行逐步执行数据集来实现此目的。但这是一个1200万行数据集,需要花费太多时间。
有更简单快捷的方法吗?
感谢您的帮助!
答案 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