Удалите группы внутри фрейма данных с помощью dplyr - PullRequest
0 голосов
/ 25 мая 2020

Мне нужна помощь, чтобы удалить группы, в которых у меня есть одно уникальное значение в COL3. Вот df

 COL1 COL2           COL3   COL4
    G1   SEQ1_-_eje.2   SEQB87 A
    G1   SEQ.2_+_eje.2  SQB83  B 
    G1   SEQ.2_+_eje.2  SQB800 C
    G1   SEQ1_-_eje.2   SEB900 D
    G2   SEQJ_-_eje.9   SEQOPL E
    G2   SEQJ_-_eje.7   SEQOPL F
    G2   SEQJ_-_eQe.3   SEQOPL G
    G3   SEQQ_+_eje.2   LOP2   H
    G3   SEQQ_-_eje.2   LOPE   I

здесь только G2 имеет уникальное COL3 значение SEQOPL, поэтому я удаляю эту группу и оставляю G1 и G3, которые имеют соответственно 3 и 2 COL3 разных элементов.

ожидаемый результат:

 COL1 COL2           COL3   COL4
    G1   SEQ1_-_eje.2   SEQB87 A
    G1   SEQ.2_+_eje.2  SQB83  B 
    G1   SEQ.2_+_eje.2  SQB800 C
    G1   SEQ1_-_eje.2   SEB900 D
    G3   SEQQ_+_eje.2   LOP2   H
    G3   SEQQ_-_eje.2   LOPE   I

Возможно, идея состоит в том, чтобы удалить все группы, в которых length(unique(df$COL3))=1?

Ответы [ 2 ]

2 голосов
/ 25 мая 2020

Ваша идея верна, фокус в том, чтобы сначала сгруппировать по COL1:

df <- data.frame(COL1 = c(rep("G1", 4), rep("G2", 3), rep("G3", 2)),
                 COL3 = c("SEQB87", "SQB83", "SQB800", "SQB900",
                          rep("SEQOPL", 3), "LOP2", "LOPE"),
                 COL4 = LETTERS[1:9])

library(dplyr)

df %>% 
  group_by(COL1) %>% 
  filter(length(unique(COL3)) > 1)

# A tibble: 6 x 3
# Groups:   COL1 [2]
  COL1  COL3   COL4 
  <fct> <fct>  <fct>
1 G1    SEQB87 A    
2 G1    SQB83  B    
3 G1    SQB800 C    
4 G1    SQB900 D    
5 G3    LOP2   H    
6 G3    LOPE   I  
0 голосов
/ 25 мая 2020

Попробуйте это, используя пакет dplyr или tidyverse:

df %>%
  group_by(COL3) %>%
  mutate(n=n()) %>%
  filter(n == 1) %>%
  select(-n)

Это дает вам

# A tibble: 6 x 4
# Groups:   COL3 [6]
  COL1  COL2          COL3   COL4 
  <chr> <chr>         <chr>  <chr>
1 G1    SEQ1_-_eje.2  SEQB87 A    
2 G1    SEQ.2_+_eje.2 SQB83  B    
3 G1    SEQ.2_+_eje.2 SQB800 C    
4 G1    SEQ1_-_eje.2  SEB900 D    
5 G3    SEQQ_+_eje.2  LOP2   H    
6 G3    SEQQ_-_eje.2  LOPE   I 

Data

df <- read_table2("COL1 COL2           COL3   COL4
    G1   SEQ1_-_eje.2   SEQB87 A
    G1   SEQ.2_+_eje.2  SQB83  B 
    G1   SEQ.2_+_eje.2  SQB800 C
    G1   SEQ1_-_eje.2   SEB900 D
    G2   SEQJ_-_eje.9   SEQOPL E
    G2   SEQJ_-_eje.7   SEQOPL F
    G2   SEQJ_-_eQe.3   SEQOPL G
    G3   SEQQ_+_eje.2   LOP2   H
    G3   SEQQ_-_eje.2   LOPE   I")
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...