首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >如何根据另一列选择多行?

如何根据另一列选择多行?
EN

Stack Overflow用户
提问于 2019-05-19 22:34:32
回答 5查看 126关注 0票数 0

我有一个数据框,有很多列和行,有很多ids,下面的数据只显示2个ids。

代码语言:javascript
复制
id  treatment  
1   A          
1   B          
1   C          
1   D          
1   E          
2   A          
2   B         
2   C  

我想得到具有五个处理(A,B,C,D,E)的id的子组。因此,输出表将如下所示:

代码语言:javascript
复制
id  treatment
1   A          
1   B        
1   C           
1   D           
1   E   

非常感谢。

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2019-05-19 22:41:20

这里有一个非常简洁的方法:

代码语言:javascript
复制
 head(my.data)
  id treatment
1  1         A
2  1         B
3  1         C
4  1         D
5  1         E
6  2         A

group_by(my.data, id) %>% filter(n_distinct(treatment) == 5)
# A tibble: 5 x 2
# Groups:   id [1]
     id treatment     
  <int> <chr>     
1     1 A            
2     1 B            
3     1 C            
4     1 D            
5     1 E   

解释

在内部,n_distinct(treatment)会统计每个id类别中唯一值的实例,因为您是按该列分组的。则filter保留出现5次的id

票数 0
EN

Stack Overflow用户

发布于 2019-05-19 23:03:28

要返回包含所有处理的ID组的子集,请执行类似以下操作:

代码语言:javascript
复制
install.packages("dplyr")
library(dplyr)

treatments <- c("A", "B", "C", "D", "E")

df %>% group_by(id) %>% filter(all(treatments %in% treatment))

#### OUTPUT ####

# A tibble: 5 x 2
# Groups:   id [1]
     id treatment
  <int> <fct>    
1     1 A        
2     1 B        
3     1 C        
4     1 D        
5     1 E        

这里的主要优点是它正确地处理了重复的条件。也就是说,在一个ID组中有相同条件的可能性很小,例如:

代码语言:javascript
复制
# A tibble: 11 x 2
      id treatment
   <dbl> <chr>    
 1     1 A        
 2     1 A        
 3     1 B        
 4     1 C        
 5     1 D        
 6     1 E        
 7     2 A        
 8     2 A        
 9     2 B        
10     2 B        
11     2 C        

上面的代码将返回包含每个条件的任何组的所有观察结果:

代码语言:javascript
复制
# A tibble: 6 x 2
# Groups:   id [1]
     id treatment
  <dbl> <chr>    
1     1 A        
2     1 A        
3     1 B        
4     1 C        
5     1 D        
6     1 E        
票数 1
EN

Stack Overflow用户

发布于 2019-05-19 23:03:53

还有一种dplyr可能性:

代码语言:javascript
复制
df %>%
 group_by(id) %>%
 filter(grepl("A,B,C,D,E", paste(treatment, collapse = ","), fixed = TRUE))

     id treatment
  <int> <chr>    
1     1 A        
2     1 B        
3     1 C        
4     1 D        
5     1 E 

在这里,它还考虑了排序,这意味着它过滤掉了治疗不进行A,B,C,D,E的情况。

如果顺序不重要,则可以先排列"treatment“列:

代码语言:javascript
复制
df %>%
 group_by(id) %>%
 arrange(treatment, .by_group = TRUE) %>%
 filter(grepl("A,B,C,D,E", paste(treatment, collapse = ","), fixed = TRUE))

考虑@gersht展示的一个场景,可以将其修改为:

代码语言:javascript
复制
df %>%
 group_by(id) %>%
 filter(grepl("A,B,C,D,E", paste(unique(treatment), collapse = ","), fixed = TRUE))

或者:

代码语言:javascript
复制
df %>%
 group_by(id) %>%
 arrange(treatment, .by_group = TRUE) %>%
 filter(grepl("A,B,C,D,E", paste(unique(treatment), collapse = ","), fixed = TRUE))
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56208811

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档