Подсчитывать частоты букв в порядке убывания

#r #character #frequency-distribution

#r #характер #распределение частот

Вопрос:

У меня есть данные, которые выглядят следующим образом

 df<-structure(list(col = structure(c(9L, 2L, 13L, 11L, 5L, 7L, 10L, 
6L, 8L, 3L, 12L, 4L, 1L), .Label = c("HHRGGVCTS", "MGSSN", "MVKTTYYDVG", 
"RRHYNGAYDD", "RTSTN", "S", "SNCWC", "sp|P31689|DNJA1_HUMAN DnaJ homolog GN=DNAJA1 PE=1 SV=2  ", 
"sp|Q9H9K5|MER34_HUMAN Endogenous PE=1 SV=1", "THYDT", "TVHAV", 
"VCMCVVDDNR", "YATTA"), class = "factor")), class = "data.frame", row.names = c(NA, 
-13L))
 

Я пытаюсь подсчитать частоты букв. Есть 20 возможных букв, которые я хочу подсчитать в каждой строке.

Например,

  1. первая строка: строка начинается с sp| so, частоты символов не вычисляются, и результатом является исходная строка
  2. вторая строка: не начинается с sp| , поэтому она будет показывать частоты символов
 MGSSN  2,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
 

это означает, что существуют 2 S , 1, M , 1, G , 1, N а остальные буквы пустые .

Частоты символов упорядочены в порядке убывания.

Конечный результат будет выглядеть следующим образом

 output<-structure(list(col = structure(c(9L, 2L, 13L, 11L, 5L, 7L, 10L, 
6L, 8L, 3L, 12L, 4L, 1L), .Label = c("HHRGGVCTS", "MGSSN", "MVKTTYYDVG", 
"RRHYNGAYDD", "RTSTN", "S", "SNCWC", "sp|P31689|DNJA1_HUMAN DnaJ homolog GN=DNAJA1 PE=1 SV=2  ", 
"sp|Q9H9K5|MER34_HUMAN Endogenous PE=1 SV=1", "THYDT", "TVHAV", 
"VCMCVVDDNR", "YATTA"), class = "factor"), Col2 = structure(c(8L, 
2L, 3L, 2L, 2L, 2L, 2L, 1L, 7L, 5L, 6L, 5L, 4L), .Label = c("1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0", 
"2,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0", "2,2,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0", 
"2,2,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0", "2,2,2,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0", 
"3,2,2,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0", "sp|P31689|DNJA1_HUMAN DnaJ homolog GN=DNAJA1 PE=1 SV=2  ", 
"sp|Q9H9K5|MER34_HUMAN Endogenous PE=1 SV=1"), class = "factor")), class = "data.frame", row.names = c(NA, 
-13L))
 

Комментарии:

1. Неясно, какие критерии вы используете. Не могли бы вы подробнее рассказать?

2. Попробуйте df %>% mutate(col = case_when(!str_detect(col, "^sp" ) ~ str_count(col, LETTERS) %>% str_c(collapse=", "), TRUE ~ as.character(col)))

Ответ №1:

Мы можем использовать str_count

 library(stringr)
i1 <- !grepl("^sp", df$col)
df$col2[i1] <- sapply(as.character(df$col[i1]), function(x)
     paste(sort(str_count(x, LETTERS), decreasing = TRUE), collapse=", "))
df$col2[!i1] <- df$col[!i1]
 

Или вместо сохранения в виде строки, это может быть list также столбец

 library(tidyverse)
df %>%
    mutate(col = as.character(col),
            col2 = map(col, ~ if(str_detect(.x, "^sp")) .x 
               else str_count(.x, LETTERS) %>% 
             sort(decreasing = TRUE))) 
 

Комментарии:

1. возможно ли, что каким-то образом с первым решением я получаю sp| во втором столбце вместо чисел?

2. @Ученик, ты имел в виду символ после sp| во втором столбце

3. Да, эта строка sp|

4. @Ученик Можете ли вы обновить ожидаемый результат в своем сообщении. Просто чтобы проверить, как вы хотели

5. Я показал результат выше. вы это видите? Я просто хочу иметь полное подобие sp| в следующем столбце, который мы создаем