我想计算数据帧中某些字符串的频率。
strings <- c("pi","pie","piece","pin","pinned","post")
df <- as.data.frame(strings)
然后我想计算字符串的频率:
counts <- c("pi", "in", "pie", "ie")
给我一些类似的东西:
string freq
pi 5
in 2
pie 2
ie 2
我已尝试使用grepl
和table
,但我看不出如何指定要搜索的字符串。
答案 0 :(得分:3)
您可以使用sapply()
转到counts
并使用counts
将strings
中的每个项目与df
grepl()
列中的logical
列匹配将返回TRUE
向量(如果匹配则为FALSE
,如果不匹配则为sapply(df, function(x) {
sapply(counts, function(y) {
sum(grepl(y, x))
})
})
)。您可以将此向量相加以获得匹配数。
strings
pi 5
in 2
pie 2
ie 2
这将返回:
Promise> Promise.then> setTimeout
答案 1 :(得分:1)
您可以使用基础R中的adist
:
data.frame(counts,freq=rowSums(!adist(counts,strings,partial = T)))
counts freq
1 pi 5
2 in 2
3 pie 2
4 ie 2
如果您对正则表达式感到满意,那么您可以这样做:
a=sapply(paste0(".*(",counts,").*|.*"),sub,"\\1",strings)
table(grep("\\w",a,value = T))
ie in pi pie
2 2 5 2
答案 2 :(得分:0)
来自qgrams
包
stringdist
创建的频率表
library(stringdist)
strings <- c("pi","pie","piece","pin","pinned","post")
frequency <- data.frame(t(stringdist::qgrams(freq = strings, q = 2)))
freq
pi 5
po 1
st 1
ie 2
in 2
nn 1
os 1
ne 1
ec 1
ed 1
ce 1
答案 3 :(得分:0)
这是我仅使用基本 R 和 tidyverse 函数的解决方案,但它可能不如人们提到的其他软件包有效。
new_df <- data.frame('VarName'=unique(df$VarName), 'Count'=0)
for (row_no in 1:nrow(new_df)) {
new_df[row_no,'Count'] = df %>%
filter(VarName==new_df[row_no, 'VarName']) %>%
nrow()
}
您需要切换的只是 df 和 VarName。