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没问题。很高兴帮助你。