2017-07-18 38 views
0

我想刪除選定列中具有單個值對的組合。R dplyr:在頻率檢查後排除單個組合值對

樣本數據:

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

Chekcing不同組合的計數:

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 

但,我想只刪除下面的一對,不管它們的頻率如何.e,1或大於1.不刪除對的原因是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 

即,除去其中僅具有一個用於在a列值組合的組合F-g

方案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 
+0

對於第二種情況,你有什麼期望輸出'DF2%>%計(A,B)' – akrun

+0

預期產量空!我將從這裏未顯示的其他'a'值獲取數據。 – Prradep

+0

目前還不清楚。這裏'df2%>%count(a,b)'給出了兩行'F',根據你的邏輯,它不應該被刪除。看起來你有一個新的邏輯 – akrun

回答

1

我們得到的count後,通過 'a' 和filter行,其中的行數大於1

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

注意做1組: count可以代替group_by/summarise步驟


ö ñ大數據集,它可能是更好的做filter第一,然後做count

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

也許我didn'試着很好地複製場景。我試圖在情景2中以一種清晰的方式表達它。請您檢查並提供建議嗎? – Prradep