Saya memiliki data.frame di mana variabel tertentu berisi string teks. Saya ingin menghitung jumlah kemunculan karakter tertentu di setiap string individu.
Contoh:
q.data<-data.frame(number=1:3, string=c("greatgreat", "magic", "not"))
Saya ingin membuat kolom baru untuk q.data dengan jumlah kemunculan "a" dalam string (mis. C (2,1,0)).
Satu-satunya pendekatan berbelit-belit yang berhasil saya lakukan adalah:
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
saat menentukan bingkai data.stringsAsFactors=TRUE
di komputer saya, tetapi tidak menyebutkan iniJika Anda tidak ingin meninggalkan basis R, berikut kemungkinan yang cukup singkat dan ekspresif:
sumber
regmatches
dangregexpr
bersama beberapa kali, tetapi kombo itu cukup kuat sehingga saya pikir itu pantas dicolok.regmatches
relatif baru. Itu diperkenalkan pada 2.14.Perhatikan bahwa saya memaksa variabel faktor menjadi karakter, sebelum meneruskan ke nchar. Fungsi regex tampaknya melakukannya secara internal.
Berikut hasil benchmark (dengan ukuran tes yang ditingkatkan menjadi 3000 baris)
sumber
fixed=TRUE
kegsub
. Ada juga kasus di manafixed=TRUE
akan diperlukan (yaitu, ketika karakter yang ingin Anda hitung dapat diartikan sebagai pernyataan regex seperti.
).adalah pilihan yang bagus.
sumber
The
stringi
paket menyediakan fungsistri_count
danstri_count_fixed
yang sangat cepat.patokan
Dibandingkan dengan pendekatan tercepat dari jawaban @ 42- dan dengan fungsi yang setara dari
stringr
paket untuk vektor dengan 30.000 elemen.data
sumber
Variasi dari https://stackoverflow.com/a/12430764/589165 adalah
sumber
Saya yakin seseorang dapat melakukan lebih baik, tetapi ini berhasil:
atau dalam sebuah fungsi:
sumber
Anda bisa menggunakan pembagian string
Yang akan memberi Anda 1, 3, 1, 0. Anda juga dapat menggunakan pembagian string dengan ekspresi reguler dan seluruh kata.
sumber
Cara IMHO termudah dan terbersih adalah:
sumber
lengths(gregexpr('a', q.data$string))
pengembalian2 1 1
, bukan2 1 0
.Pertanyaan di bawah sudah dipindahkan ke sini, tapi sepertinya halaman ini tidak langsung menjawab pertanyaan Farah El. Bagaimana menemukan nomor 1 di 101 di R
Jadi, saya akan menulis jawabannya di sini, untuk berjaga-jaga.
https://stackoverflow.com/users/8931457/farah-el
sumber
Namun
base R
opsi lain bisa jadi:sumber
Ekspresi berikutnya melakukan pekerjaan itu dan juga berfungsi untuk simbol, tidak hanya huruf.
Ekspresi bekerja sebagai berikut:
sumber
Mungkin bukan yang efisien tetapi menyelesaikan tujuan saya.
sumber