2017-10-16 72 views
1

我一直在評論StackOverflow中的可能解決方案,但是我必須要求在這個問題上尋求幫助。刪除不是NA的不完整級別的行

我有以下結構的數據幀:

df <- data.frame(A = c("A", "A", "A", "A", "B", "B", "C", "C", "C", "C", "D"), 
      B = c("F1", "F2", "F3", "F4", "F2", "F3", "F1", "F2", "F3", "F4", 
      "F4")) 

我想對其進行過濾,只保留有完整的水平的那些行,象下面這樣:

df_new <- data.frame(A = c("A", "A", "A", "A", "C", "C", "C", "C"), 
       B = c("F1", "F2", "F3", "F4", "F1", "F2", "F3", "F4")) 

請注意,過濾的Col1是受條件Col2必須有各級lvls <- c("F1", "F2", "F3", "F4"),所以使用dplyr::filtersubset是棘手的。 這是一個很長(和動態)的數據集,所以我不想這樣做手動。預先感謝您的關注。

+0

我很抱歉,在我的問題中,我的意思是說「刪除不完整級別的行不是新行」。 – plperez

回答

4

如何以下任一:

library(tidyverse) 

df %>% group_by(A) %>% 
    filter(length(unique(B)) == length(levels(B))) 

df %>% group_by(A) %>% 
    filter(n_distinct(B) == length(levels(B))) 
 A  B 
    <fctr> <fctr> 
1  A  F1 
2  A  F2 
3  A  F3 
4  A  F4 
5  C  F1 
6  C  F2 
7  C  F3 
8  C  F4 

或者,如果你需要擔心錯過值:

df %>% group_by(A) %>% 
    filter(length(unique(B[!is.na(B)])) == length(levels(B))) 

df %>% group_by(A) %>% 
    filter(n_distinct(B, na.rm=TRUE) == length(levels(B))) 
1

這裏是一個選項data.table

library(data.table) 
setDT(df)[, .SD[nlevels(droplevels(B))==max(nlevels(B))], A] 
# A B 
#1: A F1 
#2: A F2 
#3: A F3 
#4: A F4 
#5: C F1 
#6: C F2 
#7: C F3 
#8: C F4