У меня есть data.frame, в котором определенные переменные содержат текстовую строку. Я хочу подсчитать количество вхождений данного символа в каждую отдельную строку.
Пример:
q.data<-data.frame(number=1:3, string=c("greatgreat", "magic", "not"))
Я хочу создать новый столбец для q.data с числом вхождений "a" в строке (т.е. c (2,1,0)).
Единственный запутанный подход, который мне удалось сделать, это:
string.counter<-function(strings, pattern){
counts<-NULL
for(i in 1:length(strings)){
counts[i]<-length(attr(gregexpr(pattern,strings[i])[[1]], "match.length")[attr(gregexpr(pattern,strings[i])[[1]], "match.length")>0])
}
return(counts)
}
string.counter(strings=q.data$string, pattern="a")
number string number.of.a
1 1 greatgreat 2
2 2 magic 1
3 3 not 0
stringsAsFactors = FALSE
при определении фрейма данных.stringsAsFactors=TRUE
на моем компе, но не упомянул об этомЕсли вы не хотите покидать базовый R, вот довольно лаконичная и выразительная возможность:
источник
regmatches
иgregexpr
вместе несколько раз, но эта комбинация достаточно мощная, и я подумал, что она заслуживает включения.regmatches
относительно новый. Он был представлен в версии 2.14.Обратите внимание, что перед переходом к nchar я преобразовываю факторную переменную в символ. Похоже, что функции регулярных выражений делают это внутри.
Вот результаты теста (с увеличенным размером теста до 3000 строк)
источник
fixed=TRUE
вgsub
. Есть также случаи, когдаfixed=TRUE
это потребуется (например, когда символ, который вы хотите подсчитать, может быть интерпретирован как утверждение регулярного выражения, например.
).Еще один хороший вариант с использованием charToRaw :
источник
stringi
Пакет обеспечивает функциюstri_count
иstri_count_fixed
которые очень быстро.ориентир
По сравнению с самым быстрым подходом из ответа @ 42- и эквивалентной функцией из
stringr
пакета для вектора с 30,000 элементами.данные
источник
Вариант https://stackoverflow.com/a/12430764/589165 - это
источник
Я уверен, что у кого-то получится лучше, но это работает:
или в функции:
источник
Вы можете просто использовать строковое деление
Что даст вам 1, 3, 1, 0. Вы также можете использовать строковое деление с регулярными выражениями и целыми словами.
источник
Самый простой и чистый способ ИМХО:
источник
lengths(gregexpr('a', q.data$string))
возвращается2 1 1
, а не2 1 0
.Приведенный ниже вопрос был перемещен сюда, но, похоже, эта страница не отвечает напрямую на вопрос Фарах Эль. Как найти цифры 1 в 101 в R
На всякий случай напишу здесь ответ.
https://stackoverflow.com/users/8931457/farah-el
источник
Еще один
base R
вариант:источник
Следующее выражение выполняет свою работу и работает не только с буквами, но и с символами.
Выражение работает следующим образом:
источник
Может быть, не самый эффективный, но решит мою задачу.
источник