R 依赖于两列的筛选逻辑

R 依赖于两列的筛选逻辑,r,dplyr,R,Dplyr,我正在努力编写正确的逻辑,只根据一列中的条件过滤两列。我有多个id,如果一个id出现在2020年,我希望测量id的其他年份的所有数据都会出现 例如,如果一个组包含数字3,我需要该组中的所有值。我们应该得到一个包含所有b和d行的数据帧 df4 <- data.frame(group = c("a", "a", "a", "a", "a", "b", "b"

我正在努力编写正确的逻辑,只根据一列中的条件过滤两列。我有多个id,如果一个id出现在2020年,我希望测量id的其他年份的所有数据都会出现

例如,如果一个组包含数字3,我需要该组中的所有值。我们应该得到一个包含所有b和d行的数据帧

df4 <- data.frame(group = c("a", "a", "a", "a", "a", "b", "b", "b", "b", "b", 
                        "c", "c", "c", "c", "c", "d", "d", "d", "d", "d"),
                  pop = c(1, 2, 2, 4, 5, 1, 2, 3, 4, 5, 1, 2, 1, 4, 5, 1, 2, 3, 4, 5),
                  value  = c(1,2,3,2.5,2,2,3,4,3.5,3,3,2,1,2,2.5,0.5,1.5,6,2,1.5)) 

threes <- df4 %>%
   filter(pop == 3 |&ifelse????
你可以做:

df4[df4$group%在%df4$group[df4$pop==3],] >组流行值 >6b12.0 >7B23.0 >8B34.0 >9 b 4 3.5 >10 b 5 3.0 >16 d 10.5 >17 d 2 1.5 >18 d 36.0 >19 d 4 2.0 >20 d 5 1.5 你可以做:

df4[df4$group%在%df4$group[df4$pop==3],] >组流行值 >6b12.0 >7B23.0 >8B34.0 >9 b 4 3.5 >10 b 5 3.0 >16 d 10.5 >17 d 2 1.5 >18 d 36.0 >19 d 4 2.0 >20 d 5 1.5 使用dplyr:

df4%>%group_by(group)%>%filter(any(pop==3))
使用dplyr:

df4%>%group_by(group)%>%filter(any(pop==3))

这里的答案比其他答案慢一点,涉及的步骤更多,但对我来说更清楚一点:

df4 %>% 
  filter(pop == 3) %>% 
  distinct(group) %>% 
  pull(group) -> groups

df4 %>% 
  filter(group %in% groups)
或者,如果要将这两个步骤结合起来:

df4 %>% 
  filter(group %in% df4 %>% 
           filter(pop == 3) %>% 
           distinct(group) %>% 
           pull(group))

这里的答案比其他答案慢一点,涉及的步骤更多,但对我来说更清楚一点:

df4 %>% 
  filter(pop == 3) %>% 
  distinct(group) %>% 
  pull(group) -> groups

df4 %>% 
  filter(group %in% groups)
或者,如果要将这两个步骤结合起来:

df4 %>% 
  filter(group %in% df4 %>% 
           filter(pop == 3) %>% 
           distinct(group) %>% 
           pull(group))

您可以使用dplyr group_by、filter和任何组合函数来实现此目的。对于匹配条件,any将返回TRUE。Group by将对您提到的分组变量的每个子组执行操作。 遵循以下步骤:

首先,通过管道将数据传送到group_by,再传送到group by您的group变量。 然后,如果使用任何函数,任何组pop等于3,则“管道到过滤器”将按过滤。 输出:

三 一个tibble:10x3 分组:分组[2] 组流行值 1b12 2 b 2 3 3B34 4 b 4 3.5 5 b 5 3 6D10.5 7 d 2 1.5 8D36 9 d 4 2 10 d 5 1.5
您可以使用dplyr group_by、filter和任何组合函数来实现此目的。对于匹配条件,any将返回TRUE。Group by将对您提到的分组变量的每个子组执行操作。 遵循以下步骤:

首先,通过管道将数据传送到group_by,再传送到group by您的group变量。 然后,如果使用任何函数,任何组pop等于3,则“管道到过滤器”将按过滤。 输出:

三 一个tibble:10x3 分组:分组[2] 组流行值 1b12 2 b 2 3 3B34 4 b 4 3.5 5 b 5 3 6D10.5 7 d 2 1.5 8D36 9 d 4 2 10 d 5 1.5
一个简单的基本R选项是使用subset+ave

   group pop value
6      b   1   2.0
7      b   2   3.0
8      b   3   4.0
9      b   4   3.5
10     b   5   3.0
16     d   1   0.5
17     d   2   1.5
18     d   3   6.0
19     d   4   2.0

一个简单的基本R选项是使用subset+ave

   group pop value
6      b   1   2.0
7      b   2   3.0
8      b   3   4.0
9      b   4   3.5
10     b   5   3.0
16     d   1   0.5
17     d   2   1.5
18     d   3   6.0
19     d   4   2.0

这有什么不同?我并没有注意到其他人在写答案,直到我自己弄明白了这个逻辑。巧合的是,我们的逻辑是一样的。我试图更详细地解释如何使用代码,并测试了我的代码,以确保这与问题中提出的方式工作。这有什么不同?直到我自己弄明白了这个逻辑,我才注意到其他人在写答案。巧合的是,我们的逻辑是一样的。我试图更详细地解释如何使用代码,并测试了我的代码,以确保它按照问题中提出的方式工作。Base R FTW!我个人觉得使用with阅读会更容易一些,尽管没有保存nchars:df4[withdf4,group%在%group[pop==3],]中。Base R FTW!我个人觉得使用with阅读会更容易一些,尽管没有保存nchars:df4[withdf4,group%在%group[pop==3],]。