R 当满足某个条件时,如何删除一组值?

R 当满足某个条件时,如何删除一组值?,r,plyr,dplyr,R,Plyr,Dplyr,最初的数据如下所示: obs gr x1 x2 gender 1 1 0 4 M 2 1 4 13 M 3 1 13 15 M 4 1 15 15 M 5 2 0 1 F 6 2 1 15 F 7 2 15 19 F 8 2 19 30 F 9 2 30 31 F 10 3 0 2 F 11 3 2 4 F 12 3 4 7 F

最初的数据如下所示:

obs gr  x1  x2  gender
1   1   0   4   M
2   1   4   13  M
3   1   13  15  M
4   1   15  15  M
5   2   0   1   F
6   2   1   15  F
7   2   15  19  F
8   2   19  30  F
9   2   30  31  F
10  3   0   2   F
11  3   2   4   F
12  3   4   7   F
13  4   0   1   M
14  4   1   14  M
15  4   14  22  M
16  4   22  31  M
17  4   31  31  M
18  4   31  60  M
19  4   60  60  M
obs gr  x1  x2  gender
1   1   0   1   F
2   1   1   15  F
3   1   15  19  F
4   1   19  30  F
5   1   30  31  F
6   2   0   2   F
7   2   2   4   F
8   2   4   7   F
我想让数据看起来像这样:在每个gr组中,如果x1和x2的值在任何一行中相等,则该组中的所有值都将被删除。因此,新数据应如下所示:

obs gr  x1  x2  gender
1   1   0   4   M
2   1   4   13  M
3   1   13  15  M
4   1   15  15  M
5   2   0   1   F
6   2   1   15  F
7   2   15  19  F
8   2   19  30  F
9   2   30  31  F
10  3   0   2   F
11  3   2   4   F
12  3   4   7   F
13  4   0   1   M
14  4   1   14  M
15  4   14  22  M
16  4   22  31  M
17  4   31  31  M
18  4   31  60  M
19  4   60  60  M
obs gr  x1  x2  gender
1   1   0   1   F
2   1   1   15  F
3   1   15  19  F
4   1   19  30  F
5   1   30  31  F
6   2   0   2   F
7   2   2   4   F
8   2   4   7   F
gr列中的数字也应该重新排列。也就是说,在这种情况下,gr中的2变为1,gr中的3变为2

group_by(mydf, gr) %>%
filter(!any(x1 == x2)) %>%
ungroup %>%
mutate(obs = 1:n(),
       gr = as.numeric(factor(gr)))

#  obs gr x1 x2 gender
#1   1  1  0  1      F
#2   2  1  1 15      F
#3   3  1 15 19      F
#4   4  1 19 30      F
#5   5  1 30 31      F
#6   6  2  0  2      F
#7   7  2  2  4      F
#8   8  2  4  7      F

谢谢。

这里有一种方法。我相信会有更好的办法。首先,我按gr对数据进行分组。其次,我检查x1和x2中是否有值相同的行。如果有这样一行,我要求R分配1,否则为0。最后,我使用过滤器来完成子集。在那之后,我按照你的要求做了一些工作来改变gr

group_by(mydf, gr) %>%
mutate(check = ifelse(any(x1 == x2) == TRUE, 1, 0)) %>%
filter(check == 0) %>%
ungroup %>%
mutate(gr = cumsum(c(TRUE, diff(gr) != 0))) %>%
select(-check)

#  obs gr x1 x2 gender
#1   5  1  0  1      F
#2   6  1  1 15      F
#3   7  1 15 19      F
#4   8  1 19 30      F
#5   9  1 30 31      F
#6  10  2  0  2      F
#7  11  2  2  4      F
#8  12  2  4  7      F
更新

多亏了阿克伦的善意建议,我学会了一种处理这个案件的简明方法

group_by(mydf, gr) %>%
filter(!any(x1 == x2)) %>%
ungroup %>%
mutate(obs = 1:n(),
       gr = as.numeric(factor(gr)))

#  obs gr x1 x2 gender
#1   1  1  0  1      F
#2   2  1  1 15      F
#3   3  1 15 19      F
#4   4  1 19 30      F
#5   5  1 30 31      F
#6   6  2  0  2      F
#7   7  2  2  4      F
#8   8  2  4  7      F
资料


这里有一个方法。我相信会有更好的办法。首先,我按gr对数据进行分组。其次,我检查x1和x2中是否有值相同的行。如果有这样一行,我要求R分配1,否则为0。最后,我使用过滤器来完成子集。在那之后,我按照你的要求做了一些工作来改变gr

group_by(mydf, gr) %>%
mutate(check = ifelse(any(x1 == x2) == TRUE, 1, 0)) %>%
filter(check == 0) %>%
ungroup %>%
mutate(gr = cumsum(c(TRUE, diff(gr) != 0))) %>%
select(-check)

#  obs gr x1 x2 gender
#1   5  1  0  1      F
#2   6  1  1 15      F
#3   7  1 15 19      F
#4   8  1 19 30      F
#5   9  1 30 31      F
#6  10  2  0  2      F
#7  11  2  2  4      F
#8  12  2  4  7      F
更新

多亏了阿克伦的善意建议,我学会了一种处理这个案件的简明方法

group_by(mydf, gr) %>%
filter(!any(x1 == x2)) %>%
ungroup %>%
mutate(obs = 1:n(),
       gr = as.numeric(factor(gr)))

#  obs gr x1 x2 gender
#1   1  1  0  1      F
#2   2  1  1 15      F
#3   3  1 15 19      F
#4   4  1 19 30      F
#5   5  1 30 31      F
#6   6  2  0  2      F
#7   7  2  2  4      F
#8   8  2  4  7      F
资料

这里有一个使用data.table的选项

注意:.SD可以替换为.I以获取行索引,然后将其用于子集设置

或者使用base R

这里有一个使用data.table的选项

注意:.SD可以替换为.I以获取行索引,然后将其用于子集设置

或者使用base R



看到你预期的结果,我很困惑。例如,obs 4在x1和x2中有15个。如果我没有弄错的话,您不需要来自gr1组的任何数据。是这样吗?另一件事是,预期结果似乎与原始数据不匹配。我错过什么了吗?嗨,爵士音乐。预期结果不包含原始数据中第1组和第4组的任何值,因为在这两个组中,至少有一行的x1和x2值相同。虽然两个数据集不匹配,组号也发生了变化,但预期结果正是我想要的。看到你的预期结果,我感到困惑。例如,obs 4在x1和x2中有15个。如果我没有弄错的话,您不需要来自gr1组的任何数据。是这样吗?另一件事是,预期结果似乎与原始数据不匹配。我错过什么了吗?嗨,爵士音乐。预期结果不包含原始数据中第1组和第4组的任何值,因为在这两个组中,至少有一行的x1和x2值相同。虽然这两个数据集不匹配,组号也发生了变化,但预期的结果正是我想要的。嗨,jazzurro:你的代码很管用。太棒了。我真的很感谢你的帮助。事实上,在我问这个问题之前,我尝试了子集,以%为单位,等等,但它们对我来说并不好。我需要花更多的时间学习dplyr软件包。再次感谢。@Jason,不客气。我很高兴代码对您有效@akrun是的,在看到你的答案后,我现在正在考虑这个问题。我仍然有一些麻烦,以有效的方式使用过滤器。非常感谢你的建议。我会修改我的答案。@akrun是的,我看到了一篇与ifelse相关的帖子。我尽可能地避开其他人。在这种情况下,你的方式就是简洁的方式。我以为会有更好的方法,但在解决问题时,我想不出像你这样的想法。@jazzurro你的代码已经很好了,只需要修改一下。嗨,jazzurro:你的代码很管用。太棒了。我真的很感谢你的帮助。事实上,在我问这个问题之前,我尝试了子集,以%为单位,等等,但它们对我来说并不好。我需要花更多的时间学习dplyr软件包。再次感谢。@Jason,不客气。我很高兴代码对您有效@akrun是的,在看到你的答案后,我现在正在考虑这个问题。我仍然有一些麻烦,以有效的方式使用过滤器。非常感谢你的建议。我会修改我的答案。@akrun是的,我看到了一篇与ifelse相关的帖子。我尽可能地避开其他人。在这种情况下,你的方式就是简洁的方式。我以为会有更好的方法,但在解决问题时,我想不出像你这样的想法。@jazzurro你的代码已经很好了,只是需要一些修改。非常感谢你,akrun。@Jason没问题。很高兴帮助你。非常感谢你,阿克伦。@Jason没问题。很高兴帮助你。