Подтвердить что ты не робот

Как рассчитать количество появления заданного символа в каждой строке столбца строк?

У меня есть 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
4b9b3361

Ответ 1

В пакете stringr предусмотрена функция str_count, которая, похоже, делает то, что вас интересует

# Load your example data
q.data<-data.frame(number=1:3, string=c("greatgreat", "magic", "not"), stringsAsFactors = F)
library(stringr)

# Count the number of 'a in each element of string
q.data$number.of.a <- str_count(q.data$string, "a")
q.data
#  number     string number.of.a
#1      1 greatgreat           2
#2      2      magic           1
#3      3        not           0

Ответ 2

Если вы не хотите покидать базу R, здесь достаточно лаконичная и выразительная возможность:

x <- q.data$string
sapply(regmatches(x, gregexpr("g", x)), length)
# [1] 2 1 0

Обновление:. С R 3.2.0 можно использовать lengths(x) как более эффективную замену для sapply(x, length). Таким образом, приведенный выше код может быть просто

lengths(regmatches(x, gregexpr("g", x)))

Ответ 3

nchar(as.character(q.data$string)) -nchar( gsub("a", "", q.data$string))
[1] 2 1 0

Обратите внимание, что я принуждаю переменную фактора к символу, прежде чем перейти к nchar. Кажется, что функции регулярных выражений делают это внутри.

Здесь результаты тестов (с увеличенным размером теста до 3000 строк)

 q.data<-q.data[rep(1:NROW(q.data), 1000),]
 str(q.data)
'data.frame':   3000 obs. of  3 variables:
 $ number     : int  1 2 3 1 2 3 1 2 3 1 ...
 $ string     : Factor w/ 3 levels "greatgreat","magic",..: 1 2 3 1 2 3 1 2 3 1 ...
 $ number.of.a: int  2 1 0 2 1 0 2 1 0 2 ...

 benchmark( Dason = { q.data$number.of.a <- str_count(as.character(q.data$string), "a") },
 Tim = {resT <- sapply(as.character(q.data$string), function(x, letter = "a"){
                            sum(unlist(strsplit(x, split = "")) == letter) }) }, 

 DWin = {resW <- nchar(as.character(q.data$string)) -nchar( gsub("a", "", q.data$string))},
 Josh = {x <- sapply(regmatches(q.data$string, gregexpr("g",q.data$string )), length)}, replications=100)
#-----------------------
   test replications elapsed  relative user.self sys.self user.child sys.child
1 Dason          100   4.173  9.959427     2.985    1.204          0         0
3  DWin          100   0.419  1.000000     0.417    0.003          0         0
4  Josh          100  18.635 44.474940    17.883    0.827          0         0
2   Tim          100   3.705  8.842482     3.646    0.072          0         0

Ответ 4

sum(charToRaw("abc.d.aa") == charToRaw('.'))

- хороший вариант.

Ответ 5

Я уверен, что кто-то может сделать лучше, но это работает:

sapply(as.character(q.data$string), function(x, letter = "a"){
  sum(unlist(strsplit(x, split = "")) == letter)
})
greatgreat      magic        not 
     2          1          0 

или в функции:

countLetter <- function(charvec, letter){
  sapply(charvec, function(x, letter){
    sum(unlist(strsplit(x, split = "")) == letter)
  }, letter = letter)
}
countLetter(as.character(q.data$string),"a")

Ответ 6

s <- "aababacababaaathhhhhslsls jsjsjjsaa ghhaalll"
p <- "a"
s2 <- gsub(p,"",s)
numOcc <- nchar(s) - nchar(s2)

Не может быть эффективным, но решить мою цель.

Ответ 7

Я считаю символы так же, как Amarjeet. Однако я предпочитаю делать это в одной строке.

HowManySpaces<-nchar(DF$string)-nchar(gsub(" ","",DF$string)) # count spaces in DF$string

Ответ 8

Самый простой и самый чистый способ IMHO:

q.data$number.of.a <- lengths(gregexpr('a', q.data$string))

#  number     string number.of.a`
#1      1 greatgreat           2`
#2      2      magic           1`
#3      3        not           0`