Mam data.frame, w której niektóre zmienne zawierają ciąg tekstowy. Chciałbym policzyć liczbę wystąpień danego znaku w każdym pojedynczym ciągu.
Przykład:
q.data<-data.frame(number=1:3, string=c("greatgreat", "magic", "not"))
Chciałbym utworzyć nową kolumnę dla q.data z liczbą wystąpień „a” w ciągu znaków (tj. C (2,1,0)).
Jedyne zawiłe podejście, jakie udało mi się zastosować, to:
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
podczas definiowania ramki danych.stringsAsFactors=TRUE
na mojejJeśli nie chcesz opuszczać bazy R, oto dość zwięzła i wyrazista możliwość:
źródło
regmatches
igregexpr
razem kilka razy, ale to combo jest na tyle potężne, że pomyślałem, że zasługuje na wtyczkę.regmatches
jest stosunkowo nowy. Został wprowadzony w 2.14.Zauważ, że przed przejściem do nchar przekształcam zmienną czynnika w znak. Wydaje się, że funkcje regex robią to wewnętrznie.
Oto wyniki testów porównawczych (ze zwiększonym rozmiarem testu do 3000 wierszy)
źródło
fixed=TRUE
dogsub
. Istnieją również przypadki, w którychfixed=TRUE
byłoby to wymagane (tj. Gdy znak, który chcesz policzyć, mógłby zostać zinterpretowany jako potwierdzenie wyrażenia regularnego, na przykład.
).Kolejna dobra opcja, używając charToRaw :
źródło
Plik
stringi
Pakiet zawiera funkcjestri_count
istri_count_fixed
które są bardzo szybko.reper
W porównaniu z najszybszym podejściem z odpowiedzi @ 42- i równoważną funkcją z
stringr
pakietu dla wektora zawierającego 30 000 elementów.dane
źródło
Odmiana https://stackoverflow.com/a/12430764/589165 to
źródło
Jestem pewien, że ktoś może zrobić lepiej, ale to działa:
lub w funkcji:
źródło
Możesz po prostu użyć dzielenia ciągów
Co da ci 1, 3, 1, 0. Możesz także użyć dzielenia na ciąg z wyrażeniami regularnymi i całymi słowami.
źródło
Najłatwiejszym i najczystszym sposobem IMHO jest:
źródło
lengths(gregexpr('a', q.data$string))
wraca2 1 1
, nie2 1 0
.Poniższe pytanie zostało przeniesione tutaj, ale wygląda na to, że ta strona nie odpowiada bezpośrednio na pytanie Farah El. Jak znaleźć liczbę 1 w 101 w R.
Więc napiszę odpowiedź tutaj, na wszelki wypadek.
https://stackoverflow.com/users/8931457/farah-el
źródło
Jeszcze inną
base R
opcją mogłoby być:źródło
Następne wyrażenie spełnia swoje zadanie i działa również dla symboli, nie tylko liter.
Wyrażenie działa w następujący sposób:
źródło
Może nie będzie skuteczny, ale rozwiąże mój cel.
źródło