如果我有一个载体
x <- c("ajjss","acdjfkj","auyjyjjksjj")
并且做:
y <- x[grep("jj",x)]
table(y)
我明白了:
y
ajjss auyjyjjksjj
1 1
但是第二个字符串“auyjyjjksjj”应该将子字符串“jj”计算两次。如何将其从真/假计算中更改为实际计算“jj”的频率?
此外,如果对于每个字符串,可以计算子字符串的频率除以字符串的长度,这将是很好的。
提前致谢。
答案 0 :(得分:8)
我使用gregexpr()
解决了这个问题x <- c("ajjss","acdjfkj","auyjyjjksjj")
freq <- sapply(gregexpr("jj",x),function(x)if(x[[1]]!=-1) length(x) else 0)
df<-data.frame(x,freq)
df
# x freq
#1 ajjss 1
#2 acdjfkj 0
#3 auyjyjjksjj 2
对于问题的最后部分,计算频率 / 字符串长度 ...
df$rate <- df$freq / nchar(as.character(df$x))
有必要将df $ x转换回字符串,因为data.frame(x,freq)会自动将字符串转换为因子,除非您指定stringsAsFactors = F.
df
# x freq rate
#1 ajjss 1 0.2000000
#2 acdjfkj 0 0.0000000
#3 auyjyjjksjj 2 0.1818182
答案 1 :(得分:7)
您使用的是错误的工具。试试gregexpr
,它会为您提供找到搜索字符串的位置(如果未找到,则为-1):
> gregexpr("jj", x, fixed = TRUE)
[[1]]
[1] 2
attr(,"match.length")
[1] 2
attr(,"useBytes")
[1] TRUE
[[2]]
[1] -1
attr(,"match.length")
[1] -1
attr(,"useBytes")
[1] TRUE
[[3]]
[1] 6 10
attr(,"match.length")
[1] 2 2
attr(,"useBytes")
[1] TRUE
答案 2 :(得分:3)
您可以使用qdap(虽然不在基本安装R中):
x <- c("ajjss","acdjfkj","auyjyjjksjj")
library(qdap)
termco(x, seq_along(x), "jj")
## > termco(x, seq_along(x), "jj")
## x word.count jj
## 1 1 1 1(100.00%)
## 2 2 1 0
## 3 3 1 2(200.00%)
请注意,输出的频率和频率与字数相比(输出实际上是一个列表,但打印出漂亮的输出)。要访问频率:
termco(x, seq_along(x), "jj")$raw
## > termco(x, seq_along(x), "jj")$raw
## x word.count jj
## 1 1 1 1
## 2 2 1 0
## 3 3 1 2
答案 3 :(得分:2)
base r
中的这个简单的单行使用strsplit然后grepl,并且相当健壮,但如果必须将jjjjjj
之类的匹配计为3批{{1} }。使此成为可能的模式匹配来自@JoshOBriens excellent Q&A:
jj