#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 возможных букв, которые я хочу подсчитать в каждой строке.
Например,
- первая строка: строка начинается с
sp|
so, частоты символов не вычисляются, и результатом является исходная строка - вторая строка: не начинается с
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|
в следующем столбце, который мы создаем