Прокрутите фрейм данных, чтобы найти несколько шаблонов и сообщить о них.

Я пытаюсь создать цикл, который подсчитывает несколько шаблонов в строках фрейма данных и сообщает количество вхождений в новом фрейме данных.

Вот мой ввод:

input <- data.frame(V1 = LETTERS[1:4], 
             V2 = c("ABCDEF", "AAABBBCCA", "CCAABBCC", "ACCCCCCA"),
             stringsAsFactors = FALSE)

Список шаблонов, которые я хочу найти:

list<-c("ABC", "AA", "CC", "CCCC", "A")

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

structure(list(V1 = structure(1:4, .Label = c("A", "B", "C", 
"D"), class = "factor"), V2 = structure(c(2L, 1L, 4L, 3L), .Label = c("AAABBBCCA", 
"ABCDEF", "ACCCCCCA", "CCAABBCC"), class = "factor"), ABC = c(1L, 0L, 0L, 0L), AA = c(0L, 1L, 1L, 0L), CC = 0:3, CCCC = c(0L, 0L, 0L, 1L), A = c(1L, 4L, 2L, 1L), ABC_length = c(1L, 0L, 0L, 0L), AA_length = c(0L, 1L, 1L, 0L), CC_length = structure(1:4, .Label = c("0", "1", "1,1", "2"), class = "factor"), CCCC_length = c(0L, 0L, 0L, 1L), A_length = structure(c(1L, 4L, 3L, 2L), .Label = c("1", "1,1", "2", "3,1"), class = "factor")), .Names = c("V1", "V2",     "ABC", "AA", "CC", "CCCC", "A", "ABC_length", "AA_length", "CC_length",     "CCCC_length", "A_length"), class = "data.frame", row.names = c(NA, -4L))

Одним из решений может быть использование str_count или str_locate_all, пример ниже. Но на самом деле я хочу искать по приведенному выше списку шаблонов.

library(stringr)
input$ABC <- str_count(input$ABC, "ABC")
input$ABC_length <- lapply(str_locate_all(input$ABC_length, "ABC"), function(x) {
  paste(x[, 2] - x[, 1] + 1, collapse = ",")
})

person user2904120    schedule 13.08.2017    source источник
comment
просто чтобы было понятно, мой пример включает в себя решение, как найти один шаблон ABC, но вопрос касается поиска нескольких шаблонов   -  person user2904120    schedule 14.08.2017
comment
У вас нет решения для поиска шаблона ABC, потому что вы ссылаетесь на столбец, который пытаетесь создать.   -  person lebelinoz    schedule 15.08.2017


Ответы (1)


Вы на правильном пути, но имеете в виду желаемый результат в правой части формулы. Вместо

input$ABC <- str_count(input$ABC, "ABC")

(что не имеет смысла, потому что input$ABC еще не создано), попробуйте

input$ABC = str_count(input$V2, "ABC")

Аналогичная логика для input$ABC_length: вам нужно обратиться к input$V2, а не input$ABC_length, в правой части уравнения.

person lebelinoz    schedule 14.08.2017
comment
да, таким образом я бы подсчитывал только ABC, могу ли я сделать это для всех комбинаций в списке? - person user2904120; 14.08.2017
comment
Логика та же: не ссылайтесь на выходной столбец в правой части уравнения. - person lebelinoz; 15.08.2017
comment
да, а как сделать цикл, который бы выводил данные для каждого паттерна в фрейм данных - person user2904120; 15.08.2017