bru*_*lin 5 string grep r frequency
如果我有一个矢量
x <- c("ajjss","acdjfkj","auyjyjjksjj")
Run Code Online (Sandbox Code Playgroud)
并做:
y <- x[grep("jj",x)]
table(y)
Run Code Online (Sandbox Code Playgroud)
我明白了:
y
ajjss auyjyjjksjj
1 1
Run Code Online (Sandbox Code Playgroud)
但是第二个字符串"auyjyjjksjj"应该将子字符串"jj"计算两次.如何将其从真/假计算中更改为实际计算"jj"的频率?
此外,如果对于每个字符串,可以计算子字符串的频率除以字符串的长度,这将是很好的.
提前致谢.
我用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
Run Code Online (Sandbox Code Playgroud)
对于问题的最后部分,计算频率/字符串长度 ......
df$rate <- df$freq / nchar(as.character(df$x))
Run Code Online (Sandbox Code Playgroud)
有必要将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
Run Code Online (Sandbox Code Playgroud)
你使用的是错误的工具.尝试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
Run Code Online (Sandbox Code Playgroud)