R:使用dplyr删除data.frame中的某些行

时间:2018-06-10 23:26:08

标签: r dataframe dplyr

dat <- data.frame(ID = c(1, 2, 2, 2), Gender = c("Both", "Both", "Male", "Female"))
> dat
  ID Gender
1  1   Both
2  2   Both
3  2   Male
4  2 Female

对于每个ID,如果性别为BothMaleFemale,我想删除Both行。也就是说,我想要的数据是:

  ID Gender
1  1   Both
2  2   Male
3  2 Female

我已尝试使用以下代码执行此操作:

library(dplyr)
> dat %>% 
  group_by(ID) %>% 
  mutate(A = ifelse(length(unique(Gender)) >= 3 & Gender == 'Both', F, T)) %>% 
  filter(A) %>% 
  select(-A)

# A tibble: 2 x 2
# Groups:   ID [1]
     ID Gender
  <dbl> <fctr>
1     2   Male
2     2 Female

我宣布一个名为A的虚拟变量,其中A = F如果对于给定的ID,则Gender的所有3个元素都存在(&#34) ;&#34;,&#34;男&#34;和&#34;女&#34 ;;这些是Gender可以采用的不同值,其他值不可能)并且相应的行具有Gender == Both。然后我将删除该行。

但是,似乎我将A = F分配给第一行,即使其Gender仅为&#34;两者都是&#34;,但不是&#34;两者& #34;,&#34;男&#34;和&#34;女&#34;?

2 个答案:

答案 0 :(得分:2)

按'ID'分组后,创建一个逻辑条件,其中'Gender'不是'Both','Gender'中distinct个元素的长度为3,即'Male','Female','两个'(如OP提到没有其他值)或(|)如果元素数量只有1

dat %>% 
  group_by(ID) %>% 
  filter((Gender != "Both" & n_distinct(Gender)==3)| n() ==1 )
# A tibble: 3 x 2
# Groups:   ID [2]
#    ID Gender
#  <dbl> <fct> 
#1     1 Both  
#2     2 Male  
#3     2 Female

或另一种选择是

dat %>%
   group_by(ID) %>% 
   filter(Gender %in% c("Male", "Female")| n() == 1)
# A tibble: 3 x 2
# Groups:   ID [2]
#     ID Gender
#  <dbl> <fct> 
#1     1 Both  
#2     2 Male  
#3     2 Female

答案 1 :(得分:1)

从基地R,使用ave

dat[!(ave(dat$Gender,dat$ID,FUN=function(x) length(unique(x)))!='1'&(dat$Gender=='Both')),]
  ID Gender
1  1   Both
3  2   Male
4  2 Female