计算数据帧R中字符串的频率

时间:2018-03-29 09:14:21

标签: r grepl

我想计算数据帧中某些字符串的频率。

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

我已尝试使用grepltable,但我看不出如何指定要搜索的字符串。

4 个答案:

答案 0 :(得分:3)

您可以使用sapply()转到counts并使用countsstrings中的每个项目与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。