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,如果性别为Both
,Male
和Female
,我想删除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;?
答案 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