R dplyr:频率检查后排除单个组合对的值



我想删除在选定列中具有单个值对的组合。

示例数据:

df <- data.frame(a=c(sample(LETTERS[1:2],99,replace = TRUE),LETTERS[6]), 
b=sample(letters[1:10],100,replace=TRUE))

检查不同组合的计数:

df %>% group_by(a, b) %>% summarise(count=n()) %>% data.frame()
#    a b count
# 1  A a     9
# 2  A b     4
# 3  A c     4
# 4  A d     2
# 5  A e     4
# 6  A f     2
# 7  A g    12
# 8  A h     6
# 9  A i     6
# 10 A j     7
# 11 B a     3
# 12 B b     5
# 13 B c     5
# 14 B d     5
# 15 B e     3
# 16 B f     8
# 17 B g     3
# 18 B h     6
# 19 B i     1
# 20 B j     4
# 21 F g     1

我可以使用%>% filter(n() > 1)删除组合对的单个频率

,如下所示
#    a b count
# 19 B i     1
# 21 F g     1

但是,我只想删除以下对,无论它们的频率如何,即 1 或大于 1。不删除B-i对的原因是 B 仍然有其他组合对(与 a、b、c、d、e 、f、g、h(。

#    a b count
# 21 F g     1

预期产出:

#    a b count
# 1  A a     9
# 2  A b     4
# 3  A c     4
# 4  A d     2
# 5  A e     4
# 6  A f     2
# 7  A g    12
# 8  A h     6
# 9  A i     6
# 10 A j     7
# 11 B a     3
# 12 B b     5
# 13 B c     5
# 14 B d     5
# 15 B e     3
# 16 B f     8
# 17 B g     3
# 18 B h     6
# 19 B i     1
# 20 B j     4

即,删除F-g在列a中只有一个值组合的组合。

场景 2:

df2 <- data.frame(c=c(1,2,4,6,8,3), d=c(2,3,5,7,9,5),
e=c('a1','a2','a3','a4','a5','a5'),
a=c('F','F','F','F','F','F'),
b=c('a','b','a','b','a','a'))
#   c d  e a b
# 1 1 2 a1 F a
# 2 2 3 a2 F b
# 3 4 5 a3 F a
# 4 6 7 a4 F b
# 5 8 9 a5 F a
# 6 3 5 a5 F a
df2 %>% group_by(a, b) %>% filter(n()>2)
# Source: local data frame [4 x 5]
# Groups: a, b [1]
# 
# # A tibble: 4 x 5
# c     d      e      a      b
# <dbl> <dbl> <fctr> <fctr> <fctr>
# 1     1     2     a1      F      a
# 2     4     5     a3      F      a
# 3     8     9     a5      F      a
# 4     3     5     a5      F      a
df2 %>% group_by(a, b) %>% filter(n()>2) %>% summarise(count=n())
# Source: local data frame [1 x 3]
# Groups: a [?]
# 
# # A tibble: 1 x 3
#     a      b count
# <fctr> <fctr> <int>
#     F      a     4

我们得到count后,按 'a' 进行分组,并filter行数大于 1 的行

df %>%
count(a, b)  %>%
group_by(a) %>% 
filter(n()>1)

注意:count可以替换group_by/summarise步骤


在大数据集上,最好先做filter,然后再做count

df %>% 
group_by(a) %>%
filter(n() >1) %>% 
count(a, b)

最新更新