Группировка и подсчет количества элементов в df в зависимости от шаблона - PullRequest
2 голосов
/ 06 апреля 2020

Здравствуйте, у меня есть df, такой как:

Col1 Col2
Group1 Seq_1:(+)Sp1
Group1 Prot_1-A
Group1 Seq_1:(-)Sp2
Group1 Prot_1B
Group1 Seq_2:(-)Sp2
Group1 Seq_1:(+)Sp3 
Group1 Prot_1C
Group2 Seq_1:Sp5 
Group2 Prot_1-E
Group2 Prot_1G
Group2 Seq_2:(+)Sp5 
Group2 Seq_1:(+)Sp6 
Group3 Seq_1:(-)Sp7 
Group3 Prot_1H-AB
Group3 Seq_1:(+)Sp7 Prot_1Y

, и я хотел бы grouby каждой группы в Col1: - подсчитать количество различных Col2 значений, которые do not have a (+) или (-) в своем элементе. - подсчитать количество различных Col2 значений, которые do have a (+) или (-) в его элементе.

ex Group1:

  • Nb seq с (+ ) или (-) = 4
  • Nb seq без (+) или (-) = 3

Group3:

  • Nb seq с (+ ) или (-) = 2
  • Nb seq без (+) или (-) = 1

Ответы [ 2 ]

1 голос
/ 06 апреля 2020

Мы можем сгруппировать по 'Col1', получить sum из 'Col2', где есть + или -, обернутые в (), и те без этих

library(dplyr)
library(stringr)
df1 %>%
    group_by(Col1) %>%
    summarise(Sum_minus_plus = sum(str_detect(Col2, "\\([+-]\\)")),
              No_minus_plus = n() - sum(str_detect(Col2, '^Seq')))
# A tibble: 3 x 3
#  Col1   Sum_minus_plus No_minus_plus
#  <chr>           <int>         <int>
#1 Group1              4             3
#2 Group2              2             2
#3 Group3              2             1

данных

df1 <- structure(list(Col1 = c("Group1", "Group1", "Group1", "Group1", 
"Group1", "Group1", "Group1", "Group2", "Group2", "Group2", "Group2", 
"Group2", "Group3", "Group3", "Group3"), Col2 = c("Seq_1:(+)Sp1", 
"Prot_1-A", "Seq_1:(-)Sp2", "Prot_1B", "Seq_2:(-)Sp2", "Seq_1:(+)Sp3", 
"Prot_1C", "Seq_1:Sp5", "Prot_1-E", "Prot_1G", "Seq_2:(+)Sp5", 
"Seq_1:(+)Sp6", "Seq_1:(-)Sp7", "Prot_1H-AB", "Seq_1:(+)Sp7 Prot_1Y"
)), class = "data.frame", row.names = c(NA, -15L))
0 голосов
/ 06 апреля 2020

Таблицы данных допускают выражения в by (или keyby), поэтому вы можете установить аргумент группировки для тех, которые содержат или не содержат (+) или (-), а затем специальный символ .N для получения значений

1007

Даю

     Col1  Col2 N
1: Group1 FALSE 3
2: Group1  TRUE 4
3: Group2 FALSE 3
4: Group2  TRUE 2
5: Group3 FALSE 1
6: Group3  TRUE 2
...